浅析Hive的group by和count(distinct)

    首先,Hive的group by和count(distinct)都是去除重复的数据,某种程度上来说,两者产生的结果是一样的。

    实例代码:

select a,count(distinct b) from t group by a
select tt.a,count(tt.b) from (select a,b from t group by a,b)tt group by tt.a

    上面两句代码产生的结果是一样的,但是两者从效率和空间复杂度上来讲,是有很大的差别的。

    distinct会将b列所有的数据保存到内存中,形成一个类似hash的结构,速度是十分的块;但是在大数据背景下,因为b列所有的值都会形成以key值,极有可能发生OOM。

    group by会先把b列的值进行排序,如果以快速派序来说的话,他的空间复杂度就是O(1),时间复杂度是O(nlogn),这样在大数据的环境下,只有排序阶段会比较慢,时间复杂度是O(nlogn)。

    两者比较来说,distinct 耗费内存,但是效率极高,但是数据较大时,可能会产生OOM;group by如果在时间复杂度允许的情况下,可以展现出突出的空间复杂度的优势。

    最后,对于Hive来说,含有distinct的HQL语句,如果遇到瓶颈,想要调优,第一时间都是想到用group by来替换distinct来实现对数据的去重。


### 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]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值