计算RDD中的行数

时间:2015-02-09 15:37:51

标签: java apache-spark

我正在使用带有java的spark,我有一个500万行的RDD。是否有一个sollution,允许我计算我的RDD的行数。我试过RDD.count(),但需要花费很多时间。我已经看到我可以使用函数fold。但我没有找到这个函数的java文档。 你能告诉我如何使用它或给我看另一个解决方案来获取我的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+"%");

谢谢。

2 个答案:

答案 0 :(得分:56)

您有正确的想法:使用rdd.count()来计算行数。没有更快的方法。

我认为你应该问的问题是为什么rdd.count()这么慢?

答案是rdd.count()是&#34;行动&#34; - 这是一个急切的操作,因为它必须返回一个实际的数字。您在count()之前执行的RDD操作是&#34;转换&#34; - 他们懒洋洋地将RDD变成了另一个。实际上,转换并没有实际执行,只是排队等候。当您调用count()时,会强制执行所有先前的延迟操作。现在需要加载输入文件,执行map()filter(),执行随机播放等,直到最后我们有数据并且可以说它有多少行。

请注意,如果您拨打count()两次,所有这一切都会发生两次。返回计数后,所有数据都将被丢弃!如果您想避免这种情况,请在RDD上调用cache()。然后对count()的第二次调用将很快,并且导出的RDD将更快地计算。但是,在这种情况下,RDD必须存储在内存(或磁盘)中。

答案 1 :(得分:10)

丹尼尔对count的解释是正确的。但是,如果您愿意接受近似值,则可以尝试使用countApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble] RDD方法。 (注意,这被标记为&#34;实验&#34;)。