select count(distinct user)
from some_table;
此查询在地图端进行计数。每个映射器发出一个值,即计数。然后必须聚合所有值以产生总计数,这就是单个 reducer 的工作。
select count(*) from
(select user
from some_table
group by user) q;
这个查询有两个阶段。在第 1 阶段,GROUP BY 聚合地图端的用户并为每个用户发出一个值。输出必须在 reduce 端进行聚合,但它可以使用许多 reducer。在第 2 阶段COUNT
,在 map 端执行,然后使用单个 reducer 聚合最终结果。
因此,如果您有大量的地图侧拆分,那么第一个查询将不得不聚合大量的单值结果。第二个查询可以在阶段 1 的 reduce 端使用许多 reducer,然后,在阶段 2,最后将有一个较小的任务用于单独的 reducer。
这通常不是优化。您必须有大量的 map 拆分,查询 1 reducer 才会成为问题。第二个查询有两个阶段,仅此一个阶段就会比查询 1 慢(在阶段 1 完全完成之前,阶段 2 无法开始)。所以,虽然我可以看到你得到的建议的一些推理,但除非进行了适当的测量并显示出改进,否则我会持怀疑态度。