[英]Scala/Spark: Why I get different result when I run spark program in local and cluster using broadcast?
我有一个DataFrame,我想获取先前分区的值,我使用广播。这是我的代码:
val arr = Array((1, 1,1), (7, 2,1), (3, 3,2), (5, 4,2), (7, 5,3), (9, 6,3), (7, 7,4), (9, 8,4))
var rdd = sc.parallelize(arr, 4)
val bro=sc.broadcast(new mutable.HashMap[Int,Int])
rdd=rdd.mapPartitionsWithIndex(
(partIdx, iter) => {
val iterArray=iter.toArray
bro.value+=(partIdx->iterArray.last._1)
iterArray.toIterator
})
rdd=rdd.mapPartitionsWithIndex(
(partIdx, iter) => {
val iterArray = iter.toArray
var flag=true
if(partIdx!=0) {
while (flag) {
if (bro.value.contains(partIdx - 1)) {
flag = false
}
}
println(bro.value.get(partIdx-1).get)
}
iter
})
rdd.collect()
在第一个mapPartitionsWithIndex
函数中,我将每个分区的值广播;在第二个mapPartitionsWithIndex函数中,我得到广播的值。 该代码在本地运行良好,但是在群集中不起作用,该程序无法获取先前分区的值,为什么在本地和群集中使用广播运行spark程序时却得到不同的结果?
您得到不同的结果,因为您的代码不正确。 Broadcasted
对象不得修改 :
广播变量使程序员可以在每台计算机上保留一个只读变量,而不用随任务一起发送它的副本。
之所以可行,是因为您利用了local
模式的实现细节,所有线程都在一台机器上运行。 这使其类似于理解闭包中描述的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.