2015-02-09 27 views
12

Tôi đang sử dụng tia lửa với java và i hava một RDD trong số 5 triệu hàng. Có một sollution cho phép tôi để tính toán số lượng hàng của RDD của tôi. Tôi đã thử RDD.count() nhưng phải mất rất nhiều thời gian. Tôi đã thấy rằng tôi có thể sử dụng chức năng fold. Nhưng tôi đã không tìm thấy một tài liệu java của chức năng này. Bạn có thể vui lòng chỉ cho tôi cách sử dụng nó hoặc chỉ cho tôi một giải pháp khác để lấy số hàng RDD của tôi.Đếm số hàng trong RDD

Đây là mã của tôi:

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

Cảm ơn bạn.

Trả lời

42

Bạn có ý tưởng đúng: sử dụng rdd.count() để đếm số hàng. Không có cách nào nhanh hơn.

Tôi nghĩ câu hỏi bạn nên hỏi là tại sao rdd.count() quá chậm?

Câu trả lời là rdd.count() là một "hành động" — nó là một hoạt động háo hức, bởi vì nó phải trả lại một số thực. Các hoạt động RDD bạn đã thực hiện trước count() là "các phép biến đổi" — chúng đã biến RDD thành một biến thể khác. Trong thực tế các biến đổi đã không thực sự được thực hiện, chỉ xếp hàng đợi. Khi bạn gọi count(), bạn buộc tất cả các hoạt động lười biếng trước đó phải được thực hiện. Các tệp đầu vào cần phải được tải ngay bây giờ, map() s và filter() s đã thực hiện, các chuỗi được thực hiện, v.v. cho đến khi cuối cùng chúng tôi có dữ liệu và có thể cho biết có bao nhiêu hàng.

Lưu ý rằng nếu bạn gọi count() hai lần, tất cả điều này sẽ xảy ra hai lần. Sau khi đếm được trả về, tất cả dữ liệu sẽ bị hủy! Nếu bạn muốn tránh điều này, hãy gọi số cache() trên RDD. Sau đó, cuộc gọi thứ hai tới count() sẽ nhanh chóng và cũng có nguồn gốc RDDs sẽ nhanh hơn để tính toán. Tuy nhiên, trong trường hợp này RDD sẽ phải được lưu trữ trong bộ nhớ (hoặc đĩa).

7

Giải thích của Daniel về số count là đúng về số tiền. Tuy nhiên, nếu bạn sẵn sàng chấp nhận một xấp xỉ, bạn có thể thử phương thức RDD countApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble]. (Lưu ý, tuy nhiên, điều này được gắn thẻ là "Thử nghiệm").

Các vấn đề liên quan