Java 计算RDD中的行数

Java 计算RDD中的行数,java,apache-spark,Java,Apache Spark,我将spark与java结合使用,我有一个500万行的RDD。是否有一个解决方案允许我计算RDD的行数。我尝试了RDD.count(),但这需要很多时间。我已经看到我可以使用功能fold。但是我没有找到这个函数的java文档。 请告诉我如何使用它,或者告诉我获取RDD行数的另一种解决方案 这是我的密码: JavaPairRDD<String, String> lines = getAllCustomers(sc).cache(); JavaPairRDD<String,Stri

我将spark与java结合使用,我有一个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+"%");
javapairdd-lines=getAllCustomers(sc.cache();
javapairdd CFIDNotNull=lines.filter(notNull()).cache();
javapairdd join=lines.join(CFIDNotNull.cache();
double count_ctid=(double)join.count();//我想知道这三个RDD的数量
double all=(双)行。count();
double count_cfid=all-CFIDNotNull.count();
System.out.println(“*********:”+count\u cfid*100/all+”,现在是“+count\u ctid*100/all+”%);

谢谢。

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

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

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


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

丹尼尔对
计数的解释是正确的。但是,如果您愿意接受近似值,可以尝试使用
countApprox(超时:长,置信度:Double=0.95):PartialResult[BoundedDouble]
RDD方法。(但请注意,这被标记为“实验”)

@Daniel Darabos为了分析在我的应用程序中执行逻辑上不同的任务(读取、转换和写入)所花费的时间,我需要绕过
Spark
的惰性评估。因此,我在代码中插入了一些
df.cache.count
调用。这是否会显著影响性能和/或产生其他影响?我使用的是
Spark 2.3.0
,使用的是
Scala 2.11.11
,我认为这可能会对性能产生重大影响。如果添加缓存,将在该点存储和检索数据。即使没有序列化,这也不是一个微不足道的开销。但我也不知道有什么更好的方法来做你想做的事情。您的基准仍然应该代表不同任务所花费的时间。此外,您还可以针对无缓存版本进行基准测试,以查看缓存的总体效果。