2015-09-29 21 views
5

perché la funzione "campione" su Spark RDD restituisce un numero diverso di elementi anche se il parametro frazione è lo stesso? Ad esempio, se il mio codice è come qui di seguito:Come ottenere un campione con una dimensione esatta del campione in Spark RDD?

val a = sc.parallelize(1 to 10000, 3) 
a.sample(false, 0.1).count 

Ogni volta che faccio funzionare la seconda riga del codice restituisce un numero diverso non uguale a 1000. In realtà mi aspetto di vedere 1000 ogni volta, anche se il 1000 elementi potrebbero essere diverso. Qualcuno può dirmi come posso ottenere un campione con la dimensione del campione esattamente uguale a 1000? Grazie mille.

+0

http://stackoverflow.com/a/26830575/494526 – rebeling

risposta

10

Se si desidera un campione esatto, prova a fare

a.takeSample(false, 1000) 

Ma si noti che questo restituisce un array e non un RDD.

Per quanto riguarda il motivo per cui lo a.sample(false, 0.1) non restituisce la stessa dimensione del campione: questo perché la scintilla utilizza internamente qualcosa chiamato Bernoulli sampling per prelevare il campione. L'argomento fraction non rappresenta la frazione della dimensione effettiva dell'RDD. Rappresenta la probabilità che ciascun elemento della popolazione venga selezionato per il campione e come dice wikipedia:

Poiché ciascun elemento della popolazione è considerato separatamente per il campione, la dimensione del campione non è fissa ma segue piuttosto un distribuzione binomiale.

E ciò significa essenzialmente che il numero non rimane fisso.

Se si imposta il primo argomento su true, verrà utilizzato un valore denominato Poisson sampling, che determinerà anche una dimensione campione risultante non deterministica.

Aggiornamento

Se si vuole attaccare con il metodo sample, probabilmente si può specificare una probabilità più grande per il fraction param e quindi chiamare take come in:

a.sample(false, 0.2).take(1000) 

Questo dovrebbe, la maggior parte dei il tempo, ma non necessariamente sempre, porta alla dimensione del campione di 1000. Questo potrebbe funzionare se si dispone di una popolazione abbastanza grande.

+0

La ringrazio molto per la tua spiegazione. – Carter

1

Un altro modo può essere quello di prendere prima Sample e quindi creare RDD. Questo potrebbe essere lento con set di dati di grandi dimensioni.

sc.makeRDD(a.takeSample(false, 1000, 1234))