web-dev-qa-db-fra.com

Compter le nombre de lignes dans un RDD

J'utilise spark avec Java, et j'ai un RDD de 5 millions de lignes. Y a-t-il une sollicution qui me permet de calculer le nombre de lignes de mon RDD. J'ai essayé RDD.count() mais cela prend beaucoup de temps. J'ai vu que je peux utiliser la fonction fold. Mais je n'ai pas trouvé de documentation Java Pourriez-vous s'il vous plaît me montrer comment l'utiliser ou me montrer une autre solution pour obtenir le nombre de lignes de mon RDD.

Voici mon code:

JavaPairRDD<String, String> lines = getAllCustomers(sc).cache();
JavaPairRDD<String,String> CFIDNotNull = lines.filter(notNull()).cache();
JavaPairRDD<String, Tuple2<String, String>> join =lines.join(CFIDNotNull).cache();

double count_ctid = (double)join.count(); // i want to get the count of these three RDD
double all = (double)lines.count();
double count_cfid = all - CFIDNotNull.count();
System.out.println("********** :"+count_cfid*100/all +"% and now : "+ count_ctid*100/all+"%");

Merci.

19
Amine CHERIFI

Vous avez eu la bonne idée: utilisez rdd.count() pour compter le nombre de lignes. Il n'y a pas de moyen plus rapide.

Je pense que la question que vous auriez dû poser est pourquoi rdd.count() est-il si lent?

La réponse est que rdd.count() est une "action" - c'est une opération enthousiaste, car elle doit renvoyer un nombre réel. Les opérations RDD que vous avez effectuées avant count() étaient des "transformations" - elles ont transformé un RDD en un autre paresseusement. En effet, les transformations n'ont pas été réellement effectuées, juste mises en file d'attente. Lorsque vous appelez count(), vous forcez l'exécution de toutes les opérations paresseuses précédentes. Les fichiers d'entrée doivent être chargés maintenant, map() s et filter() s exécutés, shuffles effectués, etc., jusqu'à ce que nous ayons enfin les données et que nous puissions dire combien de lignes elles ont.

Notez que si vous appelez count() deux fois, tout cela se produira deux fois. Une fois le décompte renvoyé, toutes les données sont supprimées! Si vous voulez éviter cela, appelez cache() sur le RDD. Ensuite, le deuxième appel à count() sera rapide et les RDD dérivés seront également plus rapides à calculer. Cependant, dans ce cas, le RDD devra être stocké en mémoire (ou disque).

57
Daniel Darabos

L'explication de Daniel sur count est exacte. Si vous êtes prêt à accepter une approximation, vous pouvez essayer la méthode RDD countApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble]. (Notez, cependant, que cela est étiqueté comme "expérimental").

11
Timothy Perrigo