2015-02-09 97 views
12

我使用java的spark,並且我擁有500萬行RDD。是否有一種溶劑可以讓我計算RDD的行數。我試過RDD.count(),但這需要很長時間。我已經看到,我可以使用功能fold。但是我沒有找到這個函數的java文檔。 請你告訴我如何使用它或向我展示另一種解決方案來獲取RDD的行數。計算RDD中的行數

這裏是我的代碼:

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

謝謝。

回答

42

你當時的想法是:使用rdd.count()計算行數。沒有更快的方法。

我想你應該問的問題是爲什麼rdd.count()這麼慢?

答案是rdd.count()是一個「動作」—它是一個急切的操作,因爲它必須返回一個實際的數字。您在count()之前執行的RDD操作是「轉換」—他們將RDD轉換爲另一種懶惰。實際上,這些轉換並沒有實際執行,只是排隊。當您致電count()時,您強制執行所有先前的懶惰操作。現在需要加載輸入文件,執行map() s和filter(),執行洗牌等,直到最終獲得數據並可以說明它有多少行。

請注意,如果您撥打count()兩次,所有這一切將發生兩次。計數返回後,所有數據都將被丟棄!如果您想避免這種情況,請在RDD上撥打cache()。然後第二個電話count()將是快速的,也派生的RDD將更快計算。但是,在這種情況下,RDD必須存儲在內存(或磁盤)中。

7

丹尼爾對count的解釋是正確的。但是,如果您願意接受近似值,則可以嘗試countApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble] RDD方法。 (但請注意,這被標記爲「實驗」)。