2015-10-04 13 views
11

Załóżmy, że mam rdd z 3000 wierszy. Pierwsze 2000 wierszy ma klasę 1, a ostatnie 1000 wierszy klasy2. RDD jest podzielony na partycje na 100 partycji.Jak Sparks RDD.randomSplit faktycznie dzieli RDD

Dzwoniąc RDD.randomSplit(0.8,0.2)

Czy funkcja również przetasować RDD? Nasz podział dzieli się na próbkę 20% w sposób ciągły od rdd? Czy może wybrać losowo 20% partycji?

Idealnie wynikowy podział ma taki sam rozkład klas, jak oryginalny RDD. (To jest 2: 1)

Dzięki

Odpowiedz

18

dla każdego zakresu określonego przez weights tablicy jest oddzielny mapPartitionsWithIndex transformacji, która zachowuje podziału.

Każda partycja jest próbkowana przy użyciu zestawu BernoulliCellSamplers. Dla każdego podziału iteruje on nad elementami danej partycji i wybiera pozycję, jeśli wartość następnego losowego Double jest w danym zakresie zdefiniowanym przez znormalizowane wagi. Wszystkie próbniki dla danej partycji używają tego samego materiału siewnego RNG. To znaczy, że:

  • nie przetasować do RDD
  • nie bierze ciągłych bloków inne niż przypadkowo
  • bierze losową próbkę z każdej partycji
  • trwa nie nakładających próbki
  • wymagać przesłania n-dzielonych danych ponad danymi: