我正在练习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
为什么第二个不工作?
答案 0 :(得分:4)
有三个原因导致它不起作用:
accum
是一个值,因此无法重新分配Accumulable
类,Accumulator
的基类仅提供+=
方法,而不是+
+
方法可以修改accum
,但这会让人感到困惑。 答案 1 :(得分:4)
因为相信与否,Accumulator
中的Apache Spark
就像一个只写的全局变量,在我们的命令式思考中,我们看不出x += 1
和x = 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