LinkedHashMap变量在foreach循环外不可访问

时间:2015-05-25 11:58:39

标签: scala apache-spark

这是我的代码。

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

我想访问链接输出侧循环。请帮助。

1 个答案:

答案 0 :(得分:4)

为什么你的代码不起作用:

  1. foreach任务开始之前,foreach块内的整个函数关闭被序列化并首先发送给master,然后发送给每个worker。这意味着他们每个人都有自己的mutable.LinkedHashMap实例作为link的副本。
  2. foreach阻止期间,每个工作人员都会将其每个项目放在自己的link副本中
  3. 完成任务后,您仍然在每个工作节点上清空本地link和几个非空的前副本。
  4. 道德很明确:不要将本地可变集合与RDD一起使用。它不会起作用。

    将整个集合转换为本地计算机的一种方法是collect方法。 您可以将其用作:

    val link = fieldTypeMapRDD.collect.toMap
    

    或在需要保留订单的情况下:

    import scala.collection.immutable.ListMap
    val link = ListMap(fieldTypeMapRDD.collect:_*)
    

    但如果你真的进入mutable集合,你可以稍微修改你的代码。只需改变

    fieldTypeMapRDD.foreach {
    

    fieldTypeMapRDD.toLocalIterator.foreach {
    

    另见this question