我想在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
}
但是我在SparkSession
的{{1}}部分收到了一个错误,错误是:
未指定的值参数:sc:SparkContext
我知道它来自原始SparkContext中的extends SparkSession
构造函数,但是我不确定如何,或者我是否可以适当地扩展它。有什么想法吗?
答案 0 :(得分:6)
编写class Foo extends Bar
时,实际上是(1)为类Foo
创建一个默认的(无参数)构造函数,以及(2)调用类Bar
的一个默认构造函数。
因此,如果您有类似类Bar(bar: String)
的内容,则不能只编写class Foo extends Bar
,因为没有默认的构造函数要调用,您需要为bar
传递参数。因此,您可以编写类似
class Foo(bar: String) extends Bar(bar)
,这将起作用。
这就是为什么您看到此错误的原因-您试图为SparkSession
调用构造函数,但没有为sc
传递任何值。
但是您有更大的问题。您在private
旁边(以及在SparkSession
之前的另一个关键字)看到的this
关键字意味着该构造函数是...好...私有的。你不能叫它。换句话说,此类不能被子类化(在sql
包之外),因此您应该寻找另一种方法来实现您想要的工作。