2015-02-09 28 views
12

Bujiyi java ile kullanıyorum ve 5 milyon satırlık bir RDD kullanıyorum. RDD'mdeki satır sayısını hesaplamama izin veren bir yanma var mı? RDD.count()'u denedim ama çok zaman alıyor. fold işlevini kullanabileceğimi gördüm. Ama bu işlevin bir java belgesini bulamadım. Lütfen bana nasıl kullanılacağını gösterebilir veya RDD'mdeki satır sayısını elde etmek için başka bir çözüm gösterebilir misiniz? Bir RDD'deki satır sayısını sayın

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+"%"); 

teşekkür ederiz:

İşte benim kodudur.

cevap

42

Doğru fikir vardı: Satır sayısını saymak için rdd.count() kullanın. Daha hızlı bir yol yok.

Sormanız gereken soru neden rdd.count() yani yavaş?

cevap gerçek bir sayısını döndürmek için çünkü rdd.count() bir "eylem" — bir istekli operasyondur, olmasıdır. count()'dan önce gerçekleştirdiğiniz RDD işlemleri "dönüştürmeler" — idi ve bir RDD'yi başka bir tembelliğe dönüştürdüler. Gerçekte, dönüşümler gerçekte gerçekleştirilemedi, sıraya alındı. count()'u aradığınızda, önceki tüm tembel işlemlerin gerçekleştirilmesini zorlarsınız. Giriş dosyalarının şimdi yüklenmesi gerekiyor,s ve filter() s yürütüldü, karıştırmalar yapıldı, vs, nihayet verilere sahip olana ve kaç tane satır olduğunu söyleyene kadar.

Not: count()'u iki kez çağırırsanız, tüm bunlar iki kez gerçekleşir. Sayım döndükten sonra, tüm veriler atılır! Bunu önlemek istiyorsanız RDD'de cache() numaralı telefonu arayın. Ardından, count() numaralı telefona yapılan ikinci çağrı hızlı olacaktır ve ayrıca elde edilen RDD'ler daha hızlı hesaplanacaktır. Ancak, bu durumda RDD'nin bellekte (veya diskte) depolanması gerekecektir.

7

Daniel'in count açıklaması, tam para üzerindedir. Bir yaklaşımı kabul etmek istiyorsanız, yine de, countApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble] RDD yöntemini deneyebilirsiniz. (Ancak, bunun "Deneysel" olarak etiketlendiğini unutmayın).

İlgili konular