![](/img/trans.png)
[英]Why is COUNT(DISTINCT fieldA) slower than COUNT(DISTINCT LTRIM(RTRIM(UPPER(fieldA))))?
[英]Why is count(distinct) slower than group by in Hive?
在Hive上,我相信count(不同)将比group-by更可能导致减速器的工作量不平衡,并最终导致一个悲伤的减速器磨损。 下面的示例查询。
为什么?
示例查询:
select count(distinct user)
from some_table
分组版本(建议更快):
select count(*) from
(select user
from some_table
group by user) q
注意: 本演示文稿的幻灯片26描述了该问题。
select count(distinct user)
from some_table;
此查询在地图方面进行计数。 每个映射器都会发出一个值,即计数。 然后必须聚合所有值以产生总计数,这是单个减速器的工作。
select count(*) from
(select user
from some_table
group by user) q;
此查询有两个阶段。 在阶段1,GROUP BY聚合地图侧的用户并为每个用户发出一个值。 输出必须在reduce侧汇总, 但它可以使用许多reducer 。 在阶段2,在地图一侧执行COUNT
,然后使用一个减速器聚合最终结果。
因此,如果您有大量的地图侧分割,那么第一个查询将必须聚合非常大量的一个值结果。 第二个查询可以在阶段1的缩减侧使用许多减速器,然后在阶段2,对于最后的单个减速器将具有较小的任务。
这通常不是优化。 您必须有大量的地图拆分才能使查询1 reducer成为问题。 第二个查询有两个阶段,仅此一个将比查询1慢(阶段2在第1阶段完全完成之前无法启动)。 所以,虽然我可以看到你得到的建议的一些推理,但我会怀疑,除非进行适当的测量并显示出改进。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.