为什么在Hive中计数(明显)慢于group by?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在Hive中计数(明显)慢于group by?相关的知识,希望对你有一定的参考价值。

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

为什么?

示例查询:

select count(distinct user)
from some_table

分组版本(建议更快):

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

注意:this presentation的幻灯片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阶段完全完成之前无法启动)。所以,虽然我可以看到你得到的建议的一些推理,但我会怀疑,除非进行适当的测量并显示出改进。

以上是关于为什么在Hive中计数(明显)慢于group by?的主要内容,如果未能解决你的问题,请参考以下文章

在 hive mapreduce 中计数 desc

Thinkphp 下 MySQL group by 接count 获得条数方法

为啥在 hive 中执行 group by 时出现错误?

hive distribute by 和group by 的区别

Hive学习笔记 为什么group by不能使用别名?

Hive SQL子句中 group by 1 是什么意思?