2015-02-09 22 views
12

Używam iskry z Java i i hava RDD z 5 milionów wierszy. Czy istnieje rozwiązanie, które pozwala mi obliczyć liczbę wierszy mojego RDD. Próbowałem już RDD.count(), ale zajmuje to dużo czasu. Widziałem, że mogę użyć funkcji fold. Ale nie znalazłem dokumentacji Java tej funkcji. Czy możesz mi pokazać, jak z niego korzystać lub pokazać mi inne rozwiązanie, aby uzyskać liczbę wierszy mojego RDD.Liczba wierszy w RDD

Oto mój kod:

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

Dziękuję.

Odpowiedz

42

Masz dobry pomysł: użyj numeru rdd.count(), aby policzyć liczbę wierszy. Nie ma szybszej drogi.

Myślę, że pytanie, które powinieneś zadać, to , dlaczego tak powolne jest rdd.count()?

Odpowiedź jest taka, że ​​rdd.count() jest "akcją" — jest to bardzo pożądana operacja, ponieważ musi ona zwracać rzeczywistą liczbę. Operacje RDD, które wykonałeś przed count(), przekształciły RDD w innego leniwie. W efekcie transformacje nie zostały faktycznie wykonane, po prostu ustawiono w kolejce. Kiedy wywołujesz count(), wymuszasz wykonanie wszystkich poprzednich operacji leniwych. Pliki wejściowe muszą być załadowane teraz, map() s i filter() s wykonane, przetasowania wykonywane itp., Aż w końcu mamy dane i możemy powiedzieć, ile ma wierszy.

Pamiętaj, że jeśli zadzwonisz pod numer count(), wszystko to wydarzy się dwa razy. Po odliczeniu wszystkie dane są odrzucane! Jeśli chcesz tego uniknąć, zadzwoń na cache() na RDD. Wtedy drugie wywołanie count() będzie szybkie i również pochodne RDD będą szybsze do obliczenia. Jednak w tym przypadku RDD będzie musiał być przechowywany w pamięci (lub na dysku).

7

Wyjaśnienie Daniela z count jest bezpośrednio na pieniądze. Jeśli jednak chcesz zaakceptować przybliżenie, możesz wypróbować metodę RDD countApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble]. (Pamiętaj jednak, że jest to oznaczone jako "Eksperymentalne").