我想扩展 spark 中的 SparkSession 类。我复制了这里部分转载的原始 SparkSession 的构造函数:
class SparkSession private(
@transient val sparkContext: SparkContext,
@transient private val existingSharedState: Option[SharedState],
@transient private val parentSessionState: Option[SessionState],
@transient private[sql] val extensions: SparkSessionExtensions)
extends Serializable with Closeable with Logging { self =>
private[sql] def this(sc: SparkContext) {
this(sc, None, None, new SparkSessionExtensions)
}
// other implementations
}
这是我对它的扩展尝试:
class CustomSparkSession private(
@transient override val sparkContext: SparkContext,
@transient private val existingSharedState: Option[SharedState],
@transient private val parentSessionState: Option[SessionState],
@transient override private[sql] val extensions: SparkSessionExtensions)
extends SparkSession {
// implementation
}
但我在 extends SparkSession
的 SparkSession
部分收到错误消息:
Unspecified value parameters: sc: SparkContext
我知道它来自原始 SparkContext 中的 this
构造函数,但我不确定如何,或者我是否可以正确扩展它。有什么想法吗?
最佳答案
当您编写 class Foo extends Bar
时,您实际上是 (1) 为类 Foo
创建默认(无参数)构造函数,以及 (2) 调用默认Bar
类的构造函数。
因此,如果你有类似 class Bar(bar: String)
的东西,你不能只写 class Foo extends Bar
,因为没有默认构造函数调用时,您需要为 bar
传递一个参数。所以,你可以这样写
class Foo(bar: String) extends Bar(bar)
这就是您看到此错误的原因 - 您正在尝试为 SparkSession
调用构造函数,但没有为 sc
传递任何值。
但是你有一个更大的问题。您在 SparkSession
旁边看到的 private
关键字(以及 this
之前的另一个关键字)意味着构造函数是......好吧......私有(private)的。你不能调用它。换句话说,这个类不能被子类化(在 sql
包之外),所以你应该寻找另一种方法来实现你正在尝试做的事情。
关于scala 未指定值参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53564697/