2015-10-04 74 views
11

因此,假設我得到了一個3000行的rdd。 2000年的第一行是第一類,最後的1000行是第二類。 RDD跨100個分區進行分區。Sparks RDD.randomSplit如何實際拆分RDD

當調用RDD.randomSplit(0.8,0.2)

是否函數還洗牌RDD?我們的分裂只是簡單地抽樣了20%的RDD?或者它是否隨機選擇20%的分區?

理想情況下,產生的拆分與原始RDD具有相同的類分佈。 (即2:1)

由於

回答

18

對於由weights陣列定義的每個範圍有一個單獨的mapPartitionsWithIndex變換其保留分區。

使用一組BernoulliCellSamplers對每個分區進行採樣。對於每個分割,它迭代給定分區的元素,並在下一個隨機Double的值處於由歸一化權重定義的給定範圍內時選擇項目。給定分區的所有采樣器都使用相同的RNG種子。這意味着它:

  • 不洗牌RDD
  • 不採取其他連續塊比偶然
  • 需要從每個分區
  • 需要的隨機樣本的非重疊採樣
  • 要求n分裂通過數據