Scala如何通过引用传递累加器?
我试图更新函数内部的累加器,但需要知道函数外部已更新累加器值的值,该值返回不同的值(基于函数的属性) 我正在做:Scala如何通过引用传递累加器?,scala,apache-spark,pass-by-reference,pass-by-value,accumulator,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 } 当
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)
函数内部的计数器得到正确更新,但函数外部的计数器没有得到正确更新 注意
累加器是执行器的只读变量。它们可以由执行者添加到,并且只能由驱动程序读取
在您的代码中,+=
在驱动程序中被调用,因此您应该在执行器中调用它
如果只需要调用test
一次,可以使用以下方法:
sc.parallelize(Array(1)).foreach(x => test(x, counter))
我需要为Dataframe中的所有行调用test。我使用以下命令:df.rdd.map({dosomthing…test(..)}