ArrayBuffer不会在scala中将值保留在循环外部

时间:2017-06-15 12:44:17

标签: scala apache-spark

我正在尝试将rdd转换为二维数组。我正在使用下面的代码 -

import scala.collection.mutable.ArrayBuffer
var temp=new ArrayBuffer[ArrayBuffer[_>:Double]]
    f.foreach(x=> {
    temp:+= ArrayBuffer(x(0),x(1),x(2),x(3),x(4))
    println(temp)
})
println(temp)

这里是我的rdd。内部循环中的println语句正常工作。但是当外部println执行时,它不会显示任何内容。有人可以解释为什么会这样吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

由于您尚未提供f实施,我猜它为RDD[Array]

RDD本质上是分布式的。当我们在map上应用foreachreduceRDD等函数时,它们会以分布式方式执行,即由于RDD已经分发了foreach函数也以executor节点上的分布式方式执行。由于temp指向ArrayBuffer节点上创建的driver,因此分发执行无法更新ArrayBuffer指向的temp。< / p>

在将collect函数应用为

之前,正确的解决方案是f foreach
import scala.collection.mutable.ArrayBuffer
var temp=new ArrayBuffer[ArrayBuffer[_>:Double]]

f.collect.foreach(x=> {
  temp += ArrayBuffer(x(0),x(1),x(2),x(3),x(4))
  println(temp)
})
println(temp)

你应该得到预期的输出。