use*_*285 1 scala apache-spark apache-spark-sql
我想在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
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试扩展它:
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
}
Run Code Online (Sandbox Code Playgroud)
但我得到的错误SparkSession
的部分extends SparkSession
,出现错误:
未指定的值参数:sc:SparkContext
我知道它来自this
原始SparkContext中的构造函数,但我不确定如何,或者我是否可以正确扩展它.有任何想法吗?
在编写时,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
包之外),所以你应该寻找另一种方法来实现你想要做的事情.