2015-10-04 8 views
11

Supponiamo quindi di avere un rdd con 3000 righe. Le prime 2000 righe sono di classe 1 e le ultime 1000 righe sono di classe2. L'RDD è partizionato su 100 partizioni.In che modo Sparks RDD.randomSplit in realtà divide l'RDD

Quando si chiama RDD.randomSplit(0.8,0.2)

Ha la funzione anche mischiare il RDD? La nostra suddivisione semplicemente campiona il 20% continuamente del rdd? Oppure seleziona il 20% delle partizioni a caso?

Idealmente la divisione risultante ha la stessa distribuzione di classe dell'originale RDD. (Cioè 2: 1)

Grazie

risposta

18

Per ogni intervallo definito dalla matrice weights c'è un separato mapPartitionsWithIndex trasformazione che conserva partizionamento.

Ogni partizione viene campionata utilizzando un set di BernoulliCellSamplers. Per ogni suddivisione itera sugli elementi di una determinata partizione e seleziona l'elemento se il valore del successivo casuale Double si trova in un determinato intervallo definito da pesi normalizzati. Tutti i campionatori per una determinata partizione utilizzano lo stesso seme RNG. Significa che:

  • non mescolare un RDD
  • non prendere blocchi continui diverse per caso
  • prende un campione casuale di ogni partizione
  • prende campioni non sovrapposti
  • richiede n-split passa sopra i dati
Problemi correlati