我试图将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)
答案 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
。
这并不完全回答您的问题,但可能有助于构建您自己的实现。