2016-11-04 79 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相當於標識元素。