2 votes

Spark : augmenter la taille d'un RDD en utilisant l'échantillonnage avec remplacement

J'ai un RDD[(String,Array[String])] et j'ai besoin de répliquer les données à l'intérieur pour en augmenter la taille.

J'ai lu ici https://stackoverflow.com/a/41787801/9759150 avec replacemente vous pouvez obtenir deux fois le même élément dans l'échantillon.

Par exemple :

Si RDD.count() est, disons, de 35 éléments, et que je dois générer à partir de celui-ci un RDD de 200 éléments. Comment puis-je faire cela ?

J'ai vu que l'échantillon d'application est comme ça :

val sampledRDD = rdd.sample(true, fraction, seed)

Je ne sais pas comment choisir fraction paramètre à mon problème.

Merci !

1voto

Metropolis Points 1240

Vous pouvez voir este pour plus d'informations sur la signification de fraction dans rdd.sample(). En résumé, elle représente la probabilité de tirer un échantillon. Cela signifie que la valeur finale de rdd ne sera pas garantie comme suit exactement égale à la fraction spécifiée*taille originale.

J'aborderais la question dans la direction opposée :

  1. Tout d'abord, générez un RDD qui est simplement le RDD original, répété plusieurs fois.
  2. Maintenant, échantillonnez à partir de ce RDD jusqu'à la taille que vous voulez.

Quelque chose comme :

val rdds = (1 to 10).map(_ => originalRdd)
val bigRdd = sc.union(rdds)
val sampledRdd = bigRdd.sample(true, fraction, seed)

et fixer une fraction telle que le RDD final ait la taille souhaitée :

val fraction = numResultsIWant/100*originalRdd.count()

et nous avons choisi 10 parce que c'est le nombre de copies du RDD que nous avons créé.

1voto

diens Points 537

J'ai fait quelques tests et j'ai découvert que .sample() est capable de faire la chose que je voulais ! La clé est de garder avec le remplacement dans true (comme je l'ai dit dans la question), seed peut être quelconque (un nombre, bien sûr), mais fraction devrait être :

val fraction = num_new.toDouble / rdd.count()  // following my examle: num_new is 200, and rdd.count() is 35

val sampledRDD = rdd.sample(true, fraction, seed)

Dans ce cas, fraction = 5.71428571428571 c'est-à-dire que le sampledRDD aura chacun de ses éléments fraction répétées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X