Spark:无法将RDD元素添加到闭包内的可变HashMap中

Eda*_*ame 2 scala hashmap apache-spark rdd

我有以下代码,其中rddMaporg.apache.spark.rdd.RDD[(String, (String, String))],myHashMapscala.collection.mutable.HashMap.

我做.saveAsTextFile("temp_out")了强制评估rddMap.map.

然而,即使println(" t " + t)是打印东西,后来myHashMap仍然只有一个我手动放在一开始的元素("test1", ("10", "20")).其中的一切都rddMap没有投入myHashMap.

代码段:

val myHashMap = new HashMap[String, (String, String)]
myHashMap.put("test1", ("10", "20"))
rddMap.map { t =>
  println(" t " + t)
  myHashMap.put(t._1, t._2)
}.saveAsTextFile("temp_out")

println(rddMap.count)
println(myHashMap.toString)
Run Code Online (Sandbox Code Playgroud)

为什么我不能把rddMap中的元素放到我的myHashMap

Col*_*nMc 5

以下是您要完成的工作示例.

val rddMap = sc.parallelize(Map("A" -> ("v", "v"), "B" -> ("d","d")).toSeq)
// Collects all the data in the RDD and converts the data to a Map
val myMap = rddMap.collect().toMap
myMap.foreach(println)
Run Code Online (Sandbox Code Playgroud)

输出:

(A,(v,v))  
(B,(d,d))
Run Code Online (Sandbox Code Playgroud)

以下是与您发布的内容类似的代码

rddMap.map { t=> 
  println("t" + t)
  newHashMap.put(t._1, t._2)
  println(newHashMap.toString) 
}.collect
Run Code Online (Sandbox Code Playgroud)

以下是Spark shell中上述代码的输出

t(A,(v,v))  
Map(A -> (v,v), test1 -> (10,20))  
t(B,(d,d))  
Map(test1 -> (10,20), B -> (d,d))
Run Code Online (Sandbox Code Playgroud)

对我来说,看起来Spark会复制你的HashMap并将元素添加到复制的地图中.