hive中Distinct和group by去重的对比

Hive中的DISTINCT和GROUPBY都能去重,但GROUPBY效率更高。DISTINCT通过MapReduce任务,全量扫描数据,消耗大,可能引发OOM。GROUPBY利用HashTable(如HashSet/HashMap)实现,内存消耗小,支持并行处理,适合大数据量场景。
摘要由CSDN通过智能技术生成

        在Hive中, DISTINCT和GROUP BY都可以用于去重,但是它们背后的实现方式是不同的,因此它们的效率也是不同的。

        DISTINCT是一种去重方法,它会扫描整个数据集,然后将重复的记录删除,只留下唯一的记录。由于DISTINCT需要扫描整个数据集,因此它在处理大量数据时可能会更慢,在内存和I/O方面的开销也相对较高。尤其是当数据集比较大时,DISTINCT可能会出现性能瓶颈,并可能导致OOM(Out of Memory)等异常。

        GROUP BY也可以用于去重,但与DISTINCT不同,它可以在数据流中即时地进行去重处理,因此它的效率更高。GROUP BY会按照指定的逻辑条件将数据分组,并对每个分组进行统计,最后将分组的结果集合并在一起。相比之下,GROUP BY所需的内存和I/O开销相对比较小,处理大量数据时延迟和崩溃的概率相对较低

         因此,在大多数情况下,使用GROUP BY来去重是比使用DISTINCT更有效的方法,除非对完全去除重复记录有特殊需求。

        从底层代码角度来看,DISTINCT和GROUP BY共有三点不同。

DISTINCTGROUP BY

底层数据结构不同

在 Hive 中,DISTINCT 查询一般会转化为 Map Reduce 任务

Mapper 阶段的主要任务是将输入数据进行转换,并且将每个不同的值作为 key 输出。

Reducer 阶段的主要任务是将相同 key 的数据进行合并,并且将 key 输出到最终结果中。

这个过程的执行需要消耗大量的计算资源和 I/O 开销,因此在处理大规模数据时,DISTINCT 查询的性能较低,可能会出现运行时错误或者内存溢出(OOM)等情况

在hive中,GROUP BY 查询通常会通过 HashTable 实现,其底层数据结构为 HashSet 或 HashMap,因为HashTable可以实现快速的数据查找和去重

HashSet和HashMap的插入、删除、查找等操作的时间复杂度均为O(1),是极其高效的数据结构

内存消耗不同

DISTINCT 查询会对原始数据进行排序,需要较大的缓存空间,内存占用较大

GROUP BY 查询对空间的需求较小,因为其底层数据结构已经是去重的,因此可以节省内存开销

数据分布和并行度不同

DISTINCT 查询要求所有相同数据位于同一分区,可能存在临时 I/O 操作所导致的性能问题

GROUP BY 查询则允许在并行处理过程中处理分布式数据,并且支持对不同分组进行独立处理,因此并行度较高。

总结
  • GROUP BY 查询的底层数据结构、内存消耗、数据分布和并行度等方面都比 DISTINCT 更加优秀。
  • 因此,在实际应用中,如果需要处理大数据量、高并发的场景,建议优先选择 GROUP BY 查询

路漫漫其修远兮,吾将上下而求索。                ---屈原

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值