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包之外),所以你应该寻找另一种方法来实现你想要做的事情.
| 归档时间: |
|
| 查看次数: |
873 次 |
| 最近记录: |