我正在练习Apache Spark,但遇到以下问题。

val accum = sc.accumulator( 0, "My Accumulator.")
println (accum)  // print out: 0

sc.parallelize( Array(1, 2, 3, 4, 5) ).foreach( x => accum += x )
// sc.parallelize( Array(1, 2, 3, 4, 5) ).foreach( x => accum = accum + x )
println( accum.value ) // print out: 15

这行代码sc.parallelize( Array(1, 2, 3, 4, 5) ).foreach( x => accum += x )运行良好,但是下面注释掉的代码行不通。区别在于:
x => accum += x


x => accum = accum + x

为什么第二个不起作用?

最佳答案

无效的三个原因:

  • accum是一个值,因此无法重新分配
  • Accumulable类,它是Accumulator的基类,仅提供+=方法,而不提供+
  • 从worker的角度来看,
  • 累加器是只写的,因此您无法读取操作内的值。从理论上讲+方法可以在适当的地方修改accum,但这会造成困惑。
  • 10-07 23:59