web-dev-qa-db-ja.com

Sparks RDD.randomSplitが実際にRDDを分割する方法

したがって、iveが3000行のrddを持っていると想定します。最初の2000行はクラス1で、最後の1000行はクラス2です。 RDDは100個のパーティションに分割されています。

RDD.randomSplit(0.8,0.2)を呼び出すとき

関数はrddもシャッフルしますか?分割は、RDDの20%を連続的にサンプリングするだけですか?または、パーティションの20%をランダムに選択しますか?

理想的には、結果の分割は、元のRDDと同じクラス分布になります。 (つまり、2:1)

ありがとう

17
Madzor

weights配列で定義された範囲ごとに、パーティション分割を保持する個別のmapPartitionsWithIndex変換があります。

各パーティションは、BernoulliCellSamplersのセットを使用してサンプリングされます。各分割について、特定のパーティションの要素を反復処理し、次のランダムDoubleの値が正規化された重みによって定義された特定の範囲内にある場合にアイテムを選択します。特定のパーティションのすべてのサンプラーは、同じRNGシードを使用します。それはそれを意味します:

  • rDDをシャッフルしません
  • 偶然以外に連続ブロックをとらない
  • 各パーティションからランダムなサンプルを取得します
  • 重複しないサンプルを取得します
  • データをn分割する必要があります
30
zero323