Spark的累加器让我很困惑。

时间:2015-12-04 17:46:25

标签: scala apache-spark

我正在练习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

为什么第二个不工作?

2 个答案:

答案 0 :(得分:4)

有三个原因导致它不起作用:

  1. accum是一个值,因此无法重新分配
  2. Accumulable类,Accumulator的基类仅提供+=方法,而不是+
  3. 累加器从工作者角度来看是只写的,因此您无法读取操作中的值。从理论上讲,+方法可以修改accum,但这会让人感到困惑。

答案 1 :(得分:4)

因为相信与否,Accumulator中的Apache Spark就像一个只写的全局变量,在我们的命令式思考中,我们看不出x += 1x = x + 1之间的任何区别。 Apache Spark,但有一点点差异,+中的第二个操作需要读取值,但第一个不会,或者更容易(在他的解释中如何表示零) )该类的方法function detectionCompleted (barcode, qty) { $('#<%= txtBarcode.ClientID%>').val(barcode); $('#<%= btnRefresh.ClientID%>').click(); } 尚未实现。 Apache Spark在第2页。 41,您可以阅读它的工作原理,幻灯片是从Introduction to Big Data with Apache Spark

中提取的