Scala / Spark:当我使用广播在本地和集群中运行spark程序时,为什么会得到不同的结果?

时间:2017-09-08 02:04:14

标签: scala apache-spark apache-spark-sql spark-dataframe

我有一个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程序时得到不同的结果?

1 个答案:

答案 0 :(得分:1)

由于您的代码不正确,您会得到不同的结果。不得修改Broadcasted个对象

  

广播变量允许程序员在每台机器上保留一个只读变量,而不是随副本一起发送它的副本。

似乎正常工作,因为您利用了local模式实现的细节,所有线程都在一台机器上运行。这使它类似于understanding closures中描述的错误。