我想为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对象的存在?
提前致谢!
答案 0 :(得分:1)
您可以像这样修复类型错误:
val resultList = sc.accumulator(ListAccumulator.zero(Nil))(ListAccumulator)
Scala中的类型推断器出现故障,假设最具体的类型(Nil,空列表的类型)是您希望累加器的类型。通过使用zero
,并使用明确的返回类型List[(String, String)]
,您可以充分了解您的意思。
附注:您正在使用addInPlace
的列表并置,它与列表的大小呈线性关系。如果您的列表变大,您的添加速度会很慢。如果您需要有效的附加内容,请使用ListBuffer
,ArrayBuffer
或Vector
,如果您需要不可变的序列。