2016-11-04 75 views
1

我发现火花RDD.fold和scala List.fold的行为与输入相同。火花RDD.fold方法越野车?

Scala的2.11.8

List(1, 2, 3, 4).fold(1)(_ + _) // res0: Int = 11 

我认为这是正确的输出,因为1 +(1 + 2 + 3 + 4)等于11,但是火花RDD.fold看起来越野车。

星火2.0.1(非群集)

sc.parallelize(List(1, 2, 3, 4)).fold(1)(_ + _) // res0: Int = 15 

虽然RDD是不是一个简单的集合,这个结果没有意义。这是一个已知的错误或正常结果?

+0

@Shankar谢谢!在这个问题之前我应该​​搜索更多... – jyshin

回答

4

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

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

如果op+那么正确的选择是0

为什么限制这样?如果要并行执行fold,则每个块将不得不初始化其自己的zeroValue。在一个更正式的方式,你可以想想Monoid其中:

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