首页 > 解决方案 > scala 未指定值参数

问题描述

我想在 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错误extends SparkSession

未指定值参数:sc:SparkContext

我知道它来自this原始 SparkContext 中的构造函数,但我不确定如何,或者我是否可以正确扩展它。有任何想法吗?

标签: scalaapache-sparkapache-spark-sql

解决方案


当您编写时,class Foo extends Bar您实际上是(1)为 class 创建一个默认(无参数)构造函数Foo,以及(2)调用 class 的默认构造函数Bar

因此,如果你有类似 class 的东西Bar(bar: String),你不能只写class Foo extends Bar,因为没有要调用的默认构造函数,你需要为 传递一个参数bar。所以,你可以写类似

class Foo(bar: String) extends Bar(bar) 

这就是您看到此错误的原因 - 您正在尝试为 调用构造函数SparkSession,但没有为 传递任何值sc

但是你有一个更大的问题。private您在旁边看到的那个关键字SparkSession(以及之前的另一个关键字this)意味着构造函数是......好吧......私有的。你不能叫它。换句话说,这个类不能被子类化(在sql包之外),所以你应该寻找另一种方法来实现你想要做的事情。


推荐阅读