Compter le nombre de lignes dans un RDD
Je suis à l'aide d'étincelle avec java, et je dispose d'un CA de 5 millions de lignes. Est-il une solution qui me permet de calculer le nombre de lignes de mon CA. J'ai essayé RDD.count()
mais il prend beaucoup de temps. J'ai vu que je peux utiliser la fonction fold
. Mais je n'ai pas trouvé de documentation de java de cette fonction.
Pourriez-vous me montrer comment faire, ni me montrer une autre solution pour obtenir le nombre de lignes de mon CA.
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.
source d'informationauteur Amine CHERIFI | 2015-02-09
Vous devez vous connecter pour publier un commentaire.
Vous avez eu la bonne idée: utiliser
rdd.count()
à compter le nombre de lignes. Il n'y a pas de moyen plus rapide.Je pense que la question que vous devriez avoir demandé est pourquoi est
rdd.count()
- elle si lente?La réponse est que
rdd.count()
est une "action" — c'est un désireux de l'opération, car il doit retourner un nombre réel. Le RDD opérations que vous avez effectuées avantcount()
étaient des "transformations" — ils ont transformé un RDD dans un autre paresseusement. En effet, les transformations n'ont pas été effectivement réalisé, juste en file d'attente. Lorsque vous appelezcount()
vous la force de tous les précédents paresseux opérations à effectuer. Les fichiers d'entrée doivent être chargés maintenant,map()
s etfilter()
s exécutée, le mélange effectué, etc, jusqu'à ce que finalement nous avons les données et peut dire combien de lignes il est.Notez que si vous appelez
count()
deux fois, tout cela va se passer deux fois. Après le dépouillement est retourné, toutes les données sont ignorées! Si vous voulez éviter cela, appelez -cache()
sur la RDD. Ensuite, le deuxième appel àcount()
sera rapide, et aussi des dérivés RDDs sera plus rapide à calculer. Toutefois, dans ce cas, le CA devra être stockée dans la mémoire (ou le disque).Daniel explication de
count
est à droite sur l'argent. Si vous êtes prêt à accepter une approximation, même si, vous pourriez essayer lacountApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble]
RDD méthode. (Notez, cependant, que ce est étiqueté comme "Expérimental").