2016-07-05 42 views
1

我想在斯卡拉延长蓄电池类,但它在构造扩展火花蓄电池

这里失败是的IntelliJ错误:

Error:(44, 24) overloaded method constructor Accumulator with alternatives: (initialValue: org.apache.spark.AccumulatorParam[T],param: org.apache.spark.AccumulatorParam[org.apache.spark.AccumulatorParam[T]])org.apache.spark.Accumulator[org.apache.spark.AccumulatorParam[T]]` (initialValue: org.apache.spark.AccumulatorParam[T],param: org.apache.spark.AccumulatorParam[org.apache.spark.AccumulatorParam[T]],name: Option[String])org.apache.spark.Accumulator[org.apache.spark.AccumulatorParam[T]] cannot be applied to() class MyAccumulator[T] (initialValue: org.apache.spark.AccumulatorParam[T],param: org.apache.spark.AccumulatorParam[org.apache.spark.AccumulatorParam[T]])

这里是我的代码:

class MyAccumulator[T] (initialValue: AccumulatorParam[T], 
         param: AccumulatorParam[AccumulatorParam[T]]) 
    extends Accumulator[AccumulatorParam[T]] with Serializable { 

    def this(initialValue: AccumulatorParam[T], 
      param: AccumulatorParam[org.apache.spark.AccumulatorParam[T]], 
      name: Option[String]) = { 
    this(initialValue,param,name) 
    } 


    override def setValue(newValue: AccumulatorParam[T]): Unit = super.setValue(newValue) 

    override val id: Long = ??? 
    override val zero: AccumulatorParam[T] = ??? 

    override def +=(term: AccumulatorParam[T]): Unit = super.+=(term) 

    override def add(term: AccumulatorParam[T]): Unit = super.add(term) 

    override def ++=(term: AccumulatorParam[T]): Unit = super.++=(term) 

    override def merge(term: AccumulatorParam[T]): Unit = super.merge(term) 

    override def localValue: AccumulatorParam[T] = super.localValue 

    override def value: AccumulatorParam[T] = super.value 

    override def value_=(newValue: AccumulatorParam[T]): Unit = super.value_=(newValue) 

    override def toString(): String = super.toString() 
} 

由于scala在声明类属性时创建了它自己的构造函数,我不明白为什么它认为它有一个空构造函数,所以我试图声明一个构造函数,并且它在t他与额外的重复构造函数一样。

我是新来的斯卡拉和火花,请协助!

回答

2

您需要通过primary constructor传递参数给Accumulator类:

class MyAccumulator[T] (initialValue: AccumulatorParam[T], 
         param: org.apache.spark.AccumulatorParam[AccumulatorParam[T]]) 
extends Accumulator[AccumulatorParam[T]](initialValue, param) with Serializable 

错误消息:

org.apache.spark.Accumulator[org.apache.spark.AccumulatorParam[T]] cannot be applied to()

是因为Scala编译器将尝试找到一个合适的构造函数不带任何参数(arity-0),但没有,因此它不能将其应用于()

+1

作品!谢谢 – apolak