Scala未指定值参数

时间:2018-11-30 20:48:02

标签: 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

}

这是我尝试扩展的范围:

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构造函数,但是我不确定如何,或者我是否可以适当地扩展它。有什么想法吗?

1 个答案:

答案 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包之外),因此您应该寻找另一种方法来实现您想要的工作。