我正在练习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
进行适当的修改,但会造成混乱。