在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共有三点不同。
DISTINCT | GROUP 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 查询则允许在并行处理过程中处理分布式数据,并且支持对不同分组进行独立处理,因此并行度较高。文章来源:https://www.toymoban.com/news/detail-756352.html |
总结 |
|
路漫漫其修远兮,吾将上下而求索。 ---屈原文章来源地址https://www.toymoban.com/news/detail-756352.html
到了这里,关于hive中Distinct和group by去重的对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!