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

时间:2014-05-01 18:39:48

标签: scala apache-spark

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

但是,当我尝试创建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)

2 个答案:

答案 0 :(得分:7)

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

sc.accumulator(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 
}

这种行为可能不是你个人所期望的,但我希望你能抓住这个主旨。

您可能还会在此处找到一些非常有用的示例:https://github.com/apache/spark/blob/60abc252545ec7a5d59957a32e764cd18f6c16b4/core/src/test/scala/org/apache/spark/AccumulatorSuite.scala

答案 1 :(得分:7)

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

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

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