这是我的代码。
var link = scala.collection.mutable.LinkedHashMap[String, String]()
var fieldTypeMapRDD = fixedRDD.mapPartitionsWithIndex((idx, itr) => itr.map(s => (s(8), s(9))))
fieldTypeMapRDD.foreach { i =>
println(i)
link.put(i._1, i._2)
}
println(link.size)// here size is zero
我想访问链接输出侧循环。请帮助。
答案 0 :(得分:4)
为什么你的代码不起作用:
foreach
任务开始之前,foreach
块内的整个函数关闭被序列化并首先发送给master,然后发送给每个worker。这意味着他们每个人都有自己的mutable.LinkedHashMap
实例作为link
的副本。foreach
阻止期间,每个工作人员都会将其每个项目放在自己的link
副本中link
和几个非空的前副本。道德很明确:不要将本地可变集合与RDD一起使用。它不会起作用。
将整个集合转换为本地计算机的一种方法是collect
方法。
您可以将其用作:
val link = fieldTypeMapRDD.collect.toMap
或在需要保留订单的情况下:
import scala.collection.immutable.ListMap
val link = ListMap(fieldTypeMapRDD.collect:_*)
但如果你真的进入mutable
集合,你可以稍微修改你的代码。只需改变
fieldTypeMapRDD.foreach {
到
fieldTypeMapRDD.toLocalIterator.foreach {