这是我的代码。
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
我想访问侧循环外的链接。请帮忙。
为什么你的代码不应该工作:
- 在你之前
foreach
任务开始,整个函数的闭包都在里面foreach
块被序列化并首先发送到master,然后发送到每个worker。这意味着他们每个人都会有自己的实例mutable.LinkedHashMap
作为副本link
.
- During
foreach
块每个工人都会将其每个项目放入其自己的项目中link
copy
- 任务完成后,你的本地空间仍然是空的
link
每个工作节点上有几个非空的前副本。
寓意很明确:不要将本地可变集合与 RDD 一起使用。这是行不通的。
将整个集合获取到本地计算机的一种方法是collect
方法。
您可以将其用作:
val link = fieldTypeMapRDD.collect.toMap
或者如果需要保留订单:
import scala.collection.immutable.ListMap
val link = ListMap(fieldTypeMapRDD.collect:_*)
但如果你真的很喜欢mutable
集合,你可以稍微修改你的代码。只是改变
fieldTypeMapRDD.foreach {
to
fieldTypeMapRDD.toLocalIterator.foreach {
也可以看看这个问题 https://stackoverflow.com/questions/21698443/spark-best-practice-for-retrieving-big-data-from-rdd-to-local-machine.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)