scala 未指定值参数

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

}

但我在 extends SparkSessionSparkSession 部分收到错误消息:

Unspecified value parameters: sc: SparkContext

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

最佳答案

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

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

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

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

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

关于scala 未指定值参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53564697/

相关文章:

java - 提升 json :Custom serializer for java 8 LocalDateTime throwing mapping exception

scala - 在 Scala 中输入 Lambda : why is the extra parentheses needed in a declaration?

apache-spark - 如何为Spark Streaming定义Kafka(数据源)依赖项?

sql - 使用复杂类型查询 Spark SQL DataFrame

apache-spark - 将数据帧写入kafka pyspark

apache-spark - 从 Spark 2.0 到 3.0 的字符串到日期迁移导致无法识别 DateTimeFormatter 中的 'EEE MMM dd HH:mm:ss zzz yyyy' 模式

dataframe - 如何按特定字段对 Spark DataFrame 中的结构类型数组进行排序?

Scala + 对柯里化(Currying)函数的无形抽象

json - 在 Scala 中扫描一个巨大的 JSON 文件以获取可反序列化的数据

apache-spark - 使用 Spark Dataframe API 计算列中的特定字符