我发现spark RDD.fold和scala List.fold在相同输入时表现不同。
Scala 2.11.8
List(1, 2, 3, 4).fold(1)(_ + _) // res0: Int = 11
我认为这是正确的输出,因为1 +(1 + 2 + 3 + 4)等于11.但是火花RDD.fold看起来有些错误。
Spark 2.0.1(非群集)
sc.parallelize(List(1, 2, 3, 4)).fold(1)(_ + _) // res0: Int = 15
虽然RDD不是一个简单的集合,但这个结果没有意义。这是一个已知错误还是正常结果?
答案 0 :(得分:4)
这不是马车,你只是没有以正确的方式使用。 zeroElement
应该是中立的,这意味着它必须满足以下条件:
op(x, zeroValue) === op(zeroValue, x) === x
如果op
为+
,则正确的选择为0。
为何如此限制?如果要并行执行fold
,则每个块必须初始化其自己的zeroValue
。以更正式的方式,您可以考虑Monoid
其中:
op
相当于•(这是一种简化,实际上,op
中的Spark应该是可交换的,而不仅仅是关联的。)zeroElement
相当于标识元素。