计算RDD中的行数

我在Java中使用spark,并且具有500万行的RDD。有没有一种解决方案可以让我计算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+"%");

谢谢。

回答:

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

我认为您应该问的问题是

答案是rdd.count()“动作”,这是一个急切的操作,因为它必须返回实际的数字。您之前执行的RDD操作count()是“转换”-他们将RDD延迟地转换为另一个。实际上,转换实际上并没有执行,只是排队。调用时count(),您将强制执行所有先前的惰性操作。输入的文件需要立即加载,执行map()s和filter()s,执行随机播放等,直到最后我们有了数据并可以说出它有多少行。

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

以上是 计算RDD中的行数 的全部内容, 来源链接: utcz.com/qa/432855.html

回到顶部