我们是否应该始终使用 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
你不需要:
完全处理 - 某些列可能不需要提取或计算,例如不包含在任何过滤器中。您不需要加载、处理或传输不影响计数的列。
获取到驱动程序节点 - 每个工作节点都可以对它的行进行计数,并且可以将计数相加。
我看不出有什么理由打电话给 collect().size
。
仅供参考,还有另一种方法可以绕过#2,但是,对于这种情况,它是多余的并且不会阻止#1:rdd.mapPartitions(p => p.size).agg(r => r.sum())
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
你不需要:
完全处理 - 某些列可能不需要提取或计算,例如不包含在任何过滤器中。您不需要加载、处理或传输不影响计数的列。
获取到驱动程序节点 - 每个工作节点都可以对它的行进行计数,并且可以将计数相加。
我看不出有什么理由打电话给 collect().size
。
仅供参考,还有另一种方法可以绕过#2,但是,对于这种情况,它是多余的并且不会阻止#1:rdd.mapPartitions(p => p.size).agg(r => r.sum())