[英]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.