计算RDD中的行数
我正在使用带有java的spark,我有一个500万行的RDD。 是否有一个sollution可以让我计算我的RDD的行数。 我尝试过RDD.count()
但需要花费很多时间。 我已经看到我可以使用functionfold
。 但我没有找到这个函数的java文档。 你能告诉我如何使用它或给我看另一个解决方案来获取我的RDD的行数。
这是我的代码:
JavaPairRDD lines = getAllCustomers(sc).cache(); JavaPairRDD CFIDNotNull = lines.filter(notNull()).cache(); JavaPairRDD<String, Tuple2> 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()
是一个“动作” – 它是一个急切的操作,因为它必须返回一个实际的数字。 您在count()
之前执行的RDD操作是“转换” – 它们将RDD转换为另一个懒惰。 实际上,转换并未实际执行,只是排队等候。 当您调用count()
,会强制执行所有先前的延迟操作。 现在需要加载输入文件,执行map()
s和filter()
执行shuffle等,直到最后我们有数据并且可以说它有多少行。
请注意,如果您两次调用count()
,则所有这些都会发生两次。 返回计数后,所有数据都将被丢弃! 如果要避免这种情况,请在RDD上调用cache()
。 然后对count()
的第二次调用将很快,并且派生的RDD将更快地计算。 但是,在这种情况下,RDD必须存储在内存(或磁盘)中。
丹尼尔对count
的解释是正确的。 但是,如果您愿意接受近似值,则可以尝试countApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble]
RDD方法。 (注意,这被标记为“实验”)。
- 如何使用单个spark上下文在Apache Spark中运行并发作业(操作)
- 是否可以在Apache Spark中创建嵌套的RDD?
- Spark Strutured Streaming自动将时间戳转换为本地时间
- 并行读取S3中的多个文件(Spark,Java)
- 在同一Master下的Java和R Apps之间共享SparkContext
- 多节点hadoop集群中的Apache Spark Sql问题
- 如何使用Java在Spark SQL中加入多列以在DataFrame中进行过滤
- 为什么我的应用程序级别日志在oozie中执行时会消失?
- 使用saveAsTextFile的Spark NullPointerException