我有一个DataFrame,我想获得之前分区的值,我使用broadcast.This是我的代码:
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程序时得到不同的结果?
答案 0 :(得分:1)
由于您的代码不正确,您会得到不同的结果。不得修改Broadcasted
个对象 :
广播变量允许程序员在每台机器上保留一个只读变量,而不是随副本一起发送它的副本。
似乎正常工作,因为您利用了local
模式实现的细节,所有线程都在一台机器上运行。这使它类似于understanding closures中描述的错误。