我试图将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):13: error: type mismatch; found : scala.collection.mutable.HashMap.type required: org.apache.spark.AccumulatorParam[(String, Boolean)] val accum = sc.accumulator("test" -> true)(HashMap)
tkroman.. 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
首先,你应该通过一个实际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
我记得有同样的问题,这里有一个小小的要点,HashMap[String, Int]
在Spark中使用as累加器:HashMapParam.scala
如果k
累加器中已存在一个带有值的键,v1
并且我们尝试k -> v2
输入它,则生成的累加器将包含k -> v1 + v2
.
这并不能完全回答您的问题,但可能有助于构建您自己的实现.