HIVE点滴:group by和distinct语句的执行顺序

本文通过Hive SQL的实际操作验证了当一条语句中同时包含Group By和Distinct时,其执行顺序是先进行Group By再进行Distinct。并通过具体的例子展示了这种顺序如何影响查询结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同一条语句之中,如果同时有group by和distinct语句,是先group by后distinct,还是先distinct后group by呢?

先说结论:先group by后distinct。

 

以下是在HIVE中的验证:

1)建表:其中xxx替换为本地目录名

create external table tmp_tb(
id int,
content int
) row format delimited
fields terminated by ','
stored as textfile
location '/tmp/xxx';
 

2)从tmp_tb文件中导入数据

load data
local inpath '/home/xxx/tmp_tb'
overwrite into table tmp_tb;
 tmp_tb内容:

1,5

2,6

2,5

2,5

3,6

 

3)仅有group by时:

select id, count(content)
from tmp_tb
group by id;
结果如下:

1 1

2 3

3 1

 

4)同时有group by和distinct时:

select id, count(distinct content)
from tmp_tb
group by id;

结果如下:

1 1

2 2

3 1

 

可见,同时有group by和distinct时,显然是先group by 后distinct。如果是先distinct,后group by,则结果应该只有两条记录,因为content只有5和6两种数值。

### Hive SQL 中 `GROUP BY` `DISTINCT` 的区别及使用场景 #### DISTINCT 关键字 `DISTINCT` 是一种简单而直观的方法来去除重复的数据项。当查询返回的结果集中存在多行相同的记录时,`SELECT DISTINCT` 可以确保只保留唯一的一份副本。 ```sql -- 去除表t1中a字段的重复值并获取唯一的a值列表 SELECT DISTINCT a FROM t1; ``` 这种方法适用于希望快速获得某列或几列组合后的不重复集合的情况[^2]。 #### GROUP BY 子句 相比之下,`GROUP BY` 主要用于按特定条件对数据集进行分组处理,并通常配合聚合函数一起工作,比如统计每组的数量、求或其他汇总操作: ```sql -- 对表t1中的a字段进行分组,并计算每一组内有多少条记录 SELECT a, COUNT(*) AS cnt FROM t1 GROUP BY a; ``` 除了基本的功能外,在某些特殊情形下,`GROUP BY` 还能起到类似于 `DISTINCT` 的作用——即通过指定单个列为分组依据从而达到消除该列冗余的目的;不过需要注意的是,这种方式并非总是最佳实践[^1]。 #### 性能考量 对于大规模数据集而言,由于 `DISTINCT` 需要在内存中构建哈希表来进行去重运算,因此可能会消耗较多资源而导致效率低下。相反,虽然基于磁盘I/O密集型的操作模式使得 `GROUP BY` 在执行速度上未必占优,但在面对海量级输入时往往表现更为稳定可靠[^3]。 #### 多列去重情况下的差异 值得注意的是,在涉及多个不同维度的同时去重需求时(例如同时针对id,name两列),部分数据库引擎可能不允许直接应用多次 `DISTINCT` ,此时则需借助其他手段如窗口函数或是嵌套子查询等方式绕过此限制[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值