我们是否应该始终使用 rdd.count() 而不是 rdd.collect().size

Should we always use rdd.count() instead of rdd.collect().size

rdd.collect().size会先将所有数据移动到driver,如果数据集很大,可能会导致OutOfMemoryError。

那么,我们应该始终使用 rdd.count() 吗?

或者换句话说,在什么情况下,人们更喜欢rdd.collect().size

假设您在 rdd.collect() 返回的数组上使用 Scala size 函数,我认为收集整个 RDD 只是为了获取其行数没有任何优势。

这就是 RDD 的意义所在,并行处理数据块以使转换易于管理。通常结果比原始数据集小,因为给定的数据不知何故 transformed/filtered/synthesized.

collect 通常在数据处理结束时出现,如果您 运行 一个 action 您可能还想保存数据,因为可能需要一些昂贵的计算和收集的数据大概是 interesting/valuable.

collect 导致数据被处理,然后被提取到驱动程序节点。

count 你不需要:

  1. 完全处理 - 某些列可能不需要提取或计算,例如不包含在任何过滤器中。您不需要加载、处理或传输不影响计数的列。

  2. 获取到驱动程序节点 - 每个工作节点都可以对它的行进行计数,并且可以将计数相加。

我看不出有什么理由打电话给 collect().size

仅供参考,还有另一种方法可以绕过#2,但是,对于这种情况,它是多余的并且不会阻止#1:rdd.mapPartitions(p => p.size).agg(r => r.sum())