Spark:创建新的累加器类型不起作用(Scala)

时间:2015-05-21 14:48:06

标签: scala apache-spark accumulator

我想为List [(String,String)]类型的列表创建一个累加器。我首先创建了以下对象:

object ListAccumulator extends AccumulatorParam[List[(String, String)]] {
  def zero(initialValue: List[(String, String)]): List[(String, String)] = {
    Nil
  }

  def addInPlace(list1: List[(String, String)], list2: List[(String, String)]): List[(String, String)] = {
    list1 ::: list2
  }
}

在同一个文件(SparkQueries.scala)中,我尝试在我班级的一个函数中使用它:

val resultList = sc.accumulator(Nil)(ListAccumulator)

但是,我的编译器在这里抱怨(ListAccumulator)。发生以下错误:

  

类型不匹配; found:sparkMain.ListAccumulator.type required:org.apache.spark.AccumulatorParam [scala.collection.immutable.Nil.type]注意:List [(String,String)]>:scala.collection.immutable.Nil.type(和sparkMain.ListAccumulator.type&lt ;: org.apache.spark.AccumulatorParam [List [(String,String)]]),但是特性AccumulatorParam在类型T中是不变的。你可能希望将T定义为-T。

sparkMain是.scala文件所在的包。我做错了什么?编译器是否可能不知道ListAccumulator对象的存在?

提前致谢!

1 个答案:

答案 0 :(得分:1)

您可以像这样修复类型错误:

val resultList = sc.accumulator(ListAccumulator.zero(Nil))(ListAccumulator)

Scala中的类型推断器出现故障,假设最具体的类型(Nil,空列表的类型)是您希望累加器的类型。通过使用zero,并使用明确的返回类型List[(String, String)],您可以充分了解您的意思。

附注:您正在使用addInPlace的列表并置,它与列表的大小呈线性关系。如果您的列表变大,您的添加速度会很慢。如果您需要有效的附加内容,请使用ListBufferArrayBufferVector,如果您需要不可变的序列。