scala未指定的值参数

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中的构造函数,但我不确定如何,或者我是否可以正确扩展它.有任何想法吗?

Dim*_*ima 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包之外),所以你应该寻找另一种方法来实现你想要做的事情.