17

在 Hive 上,我相信 count(distinct) 比 group-by 更有可能导致减速器的工作量不平衡,最终导致一个可悲的减速器磨掉。下面的示例查询。

为什么?

示例查询:

select count(distinct user)
from some_table

带有 group-by 的版本(建议更快):

select count(*) from
(select user
 from some_table
 group by user) q

注意:本演示文稿的幻灯片 26描述了该问题。

4

1 回答 1

21
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 无法开始)。所以,虽然我可以看到你得到的建议的一些推理,但除非进行了适当的测量并显示出改进,否则我会持怀疑态度。

于 2013-10-11T09:20:32.327 回答