计算 RDD 中的行数
Count number of rows in an 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()
是一个 "action" — 这是一个急切的操作,因为它必须 return 一个实际数字。您在 count()
之前执行的 RDD 操作是 "transformations" — 它们懒惰地将一个 RDD 转换为另一个。实际上,转换并没有真正执行,只是排队。当您调用 count()
时,您强制执行所有先前的惰性操作。现在需要加载输入文件,执行 map()
s 和 filter()
s,执行随机播放等,直到我们最终获得数据并可以说出它有多少行。
请注意,如果您调用 count()
两次,所有这些都会发生两次。计数 return 后,所有数据都被丢弃了!如果你想避免这种情况,请在 RDD 上调用 cache()
。然后对 count()
的第二次调用会很快,而且派生的 RDD 的计算速度也会更快。但是,在这种情况下,RDD 必须存储在内存(或磁盘)中。
Daniel 对 count
的解释是对的。不过,如果您愿意接受近似值,则可以尝试 countApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble]
RDD 方法。 (不过请注意,这被标记为 "Experimental")。
我在 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()
是一个 "action" — 这是一个急切的操作,因为它必须 return 一个实际数字。您在 count()
之前执行的 RDD 操作是 "transformations" — 它们懒惰地将一个 RDD 转换为另一个。实际上,转换并没有真正执行,只是排队。当您调用 count()
时,您强制执行所有先前的惰性操作。现在需要加载输入文件,执行 map()
s 和 filter()
s,执行随机播放等,直到我们最终获得数据并可以说出它有多少行。
请注意,如果您调用 count()
两次,所有这些都会发生两次。计数 return 后,所有数据都被丢弃了!如果你想避免这种情况,请在 RDD 上调用 cache()
。然后对 count()
的第二次调用会很快,而且派生的 RDD 的计算速度也会更快。但是,在这种情况下,RDD 必须存储在内存(或磁盘)中。
Daniel 对 count
的解释是对的。不过,如果您愿意接受近似值,则可以尝试 countApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble]
RDD 方法。 (不过请注意,这被标记为 "Experimental")。