Scala如何通过引用传递累加器?

时间:2018-03-26 03:28:32

标签: scala apache-spark pass-by-reference pass-by-value accumulator

我正在尝试更新函数内的累加器,但需要知道函数外部更新的累加器值的值,该函数返回不同的值(基于函数的属性)

我在做:

def test(value: Any, counter : Accumulator[Double]): String = {
    try {
     // do something 
        counter+= 1
        println("counter = "+ counter)
      }
    }
    return string
  }

我打电话的时候:

val counter : Accumulator[Double] = sc.accumulator(0, "COUNTER")
test(A, counter)
println(counter)

函数内部的计数器正在更新,但不是函数外部的计数器。

1 个答案:

答案 0 :(得分:1)

请注意

  

累加器是执行程序的只写变量。它们可以由执行程序添加,仅由驱动程序读取。

在您的代码中,+=会调用driver,因此您应该在executors中调用它。

如果您只需要拨打test一次,就可以使用以下内容:

sc.parallelize(Array(1)).foreach(x => test(x, counter))