代码之家  ›  专栏  ›  技术社区  ›  user3685285

scala未指定值参数

  •  1
  • user3685285  · 技术社区  · 6 年前

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

    1 回复  |  直到 6 年前
        1
  •  11
  •   Saurav Sahu    4 年前

    当你写作的时候 class Foo extends Bar 实际上,您正在(1)为类创建一个默认(无参数)构造函数 Foo ,和(2)调用类的默认构造函数 Bar .

    因此,如果你有类似的课程 Bar(bar: String) ,你不能只是写 类Foo扩展条 ,因为没有要调用的默认构造函数,所以需要为 bar .所以,你可以写

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

    这就是为什么你会看到这个错误——你正试图调用一个构造函数 SparkSession ,但不传递任何值 sc .

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