火花RDD.fold方法有多少?

时间:2016-11-04 13:36:13

标签: scala apache-spark

我发现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不是一个简单的集合,但这个结果没有意义。这是一个已知错误还是正常结果?

1 个答案:

答案 0 :(得分:4)

这不是马车,你只是没有以正确的方式使用。 zeroElement应该是中立的,这意味着它必须满足以下条件:

op(x, zeroValue) === op(zeroValue, x) === x 

如果op+,则正确的选择为0。

为何如此限制?如果要并行执行fold,则每个块必须初始化其自己的zeroValue。以更正式的方式,您可以考虑Monoid其中:

  • op相当于•(这是一种简化,实际上,op中的Spark应该是可交换的,而不仅仅是关联的。)
  • zeroElement相当于标识元素。