Comment obtenir un échantillon avec une taille exacte de l'échantillon dans Spark RDD?
Pourquoi le rdd.sample()
fonction Spark RDD retourner un nombre différent d'éléments, même si la fraction paramètre est le même? Par exemple, si mon code est comme ci-dessous:
val a = sc.parallelize(1 to 10000, 3)
a.sample(false, 0.1).count
Chaque fois que je lance la deuxième ligne de code, il renvoie un nombre différent de ne pas égal à 1000. En fait je m'attends à voir 1000 à chaque fois, bien que la 1000 éléments peuvent être différentes. Quelqu'un peut me dire comment je peux obtenir un échantillon avec la taille de l'échantillon exactement égal à 1000? Je vous remercie beaucoup.
Vous devez vous connecter pour publier un commentaire.
Si vous voulez un échantillon exacte, essayez de faire
Mais notez que cette fonction retourne un Tableau et non une
RDD
.Quant à savoir pourquoi le
a.sample(false, 0.1)
ne retourne pas la même taille de l'échantillon: c'est parce que l'étincelle à l'interne utilise ce qu'on appelle Bernoulli échantillonnage pour le prélèvement de l'échantillon. Lefraction
argument ne représente pas la fraction de la taille réelle de la RDD. Il représente la probabilité de chaque élément dans la population sélectionnée pour l'exemple, et comme dit wikipedia:Et qui essentiellement signifie que le nombre ne reste pas fixe.
Si vous définissez le premier argument de
true
, puis il va utiliser ce qu'on appelle Poisson d'échantillonnage, qui se traduit également dans un non-déterministe résultante de la taille de l'échantillon.Mise à jour
Si vous voulez coller avec le
sample
méthode, vous pouvez probablement spécifier une plus grande probabilité pour que lafraction
param puis appelertake
comme dans:Ce devrait, la plupart du temps, mais pas forcément toujours raison de la taille de l'échantillon de 1000. Cela pourrait fonctionner si vous avez une assez grande population.
Une autre façon peut-être d'abord takeSample et puis faire de la RDD. Cela peut être lent avec de grands ensembles de données.