Scala Apache Spark:Hashmap累加器出现类型不匹配错误

Scala Apache Spark:Hashmap累加器出现类型不匹配错误,scala,apache-spark,Scala,Apache Spark,我试图将hashmap声明为Spark(v0.9.1)累加器。文档声明“Spark本机支持数值类型的累加器和标准可变集合…”() 但是,当我尝试创建HashMap[String,Boolean]时,这似乎不适用于我: scala> import collection.mutable.HashMap import collection.mutable.HashMap scala> val accum = sc.accumulator("test" -> true)(HashMa

我试图将hashmap声明为Spark(v0.9.1)累加器。文档声明“Spark本机支持数值类型的累加器和标准可变集合…”()

但是,当我尝试创建HashMap[String,Boolean]时,这似乎不适用于我:

scala> import collection.mutable.HashMap
import collection.mutable.HashMap

scala> val accum = sc.accumulator("test" -> true)(HashMap)
<console>:13: error: type mismatch;
 found   : scala.collection.mutable.HashMap.type
 required: org.apache.spark.AccumulatorParam[(String, Boolean)]
           val accum = sc.accumulator("test" -> true)(HashMap)
scala>import collection.mutable.HashMap
导入collection.mutable.HashMap
scala>val accum=sc.acculator(“测试”->true)(HashMap)
:13:错误:类型不匹配;
找到:scala.collection.mutable.HashMap.type
必需:org.apache.spark.AccumeratorParam[(字符串,布尔值)]
val accum=sc.累加器(“测试”->真)(哈希映射)

首先,您应该传递一个实际的
HashMap[String,String]
而不是
(String,String)

sc.acculator(HashMap(“t”->true))

您可能需要编写自己的累加器,因为我没有为
HashMap
找到现成的隐式:

implicit object iHashMap extends AccumulatorParam[HashMap[String, Boolean]] {
  def zero(m: HashMap[String, String]) = HashMap()
  def addInPlace(m1: HashMap[String, Boolean], m2: HashMap[String, Boolean]) = m1 ++ m2 
}
这种行为可能不是你个人所期望的,但我希望你能抓住要点


您还可以在这里找到一些非常有用的示例:

我记得有同样的问题,这里有一个小要点,可以使用
HashMap[String,Int]
作为Spark中的累加器:

如果一个键
k
已经存在于累加器中,其值为
v1
,并且我们尝试将
k->v2
放入其中,则生成的累加器将包含
k->v1+v2


这并不能完全回答您的问题,但可能有助于构建您自己的实现。

为什么要使用可变哈希映射?你不能试着用一种功能性的方式设计你的代码吗?要点是有些地方有缺陷。例如,addAccumulator方法不编译。此外,addAccumulator未就位,因此您需要在示例中重新分配到accu1以返回完整的集合。您好,我的要点确实缺少一个导入(
AccumulableParam
),因此它不会立即编译。。。除此之外,你为什么说它不起作用?我创建了一个带有一些测试的小项目,它们都是绿色的,你能看一下吗?我遇到了类似的问题,并使用新的AccumeratorV2 API创建了一个解决方案。看到了吗,当我们尝试使用
acculator+=(a->b)
添加到累加器时,它抛出了一个编译时错误,该错误期望hashmap,但找到了tuple?@Sohaib,正如我所说的,您应该传递的不是tuple,而是
Map
实例。正确的语法如
acculator+=hashmap(a->b)
?@Sohaib请阅读我的答案,它包含您需要的所有内容。我对Accumulator param的实现与给定的略有不同。它类似于
acgregatorParam[mutable.HashMap[String,Long]]
。这个例子给出了如何创建累加器的构造。我还想知道如何补充。我还看到了您提供的文档链接,但它使用
accumulableCollection
创建累加器,这是不同的。