hive的group by与distinct的区别及性能测试比较 Hive去重统计 相信使用Hive的人平时会经常用到去重统计之类的吧,但是好像平时很少关注这个去重的性能问题,但是当一个表的数据量非常大的时候,会发现一个简单的count(distinct order_no)这种语句跑的特别慢,和直接运行count(order_no)的时间差了很多,于是研究了一下。 ...
一般来说,DISTINCT在处理简单去重时可能略快于GROUP BY,但在某些复杂查询中,GROUP BY可能会更有效。 旅行图 为了让你更直观地理解这个过程,我们使用Mermaid中的journey来展现查询的旅程: 用户 数据准备 准备数据集 插入数据 执行查询 执行DISTINCT查询 执行GROUP BY查询 比较结果 分析执行时间 Hive Distinct 和 Group ...
但是执行效率上,group by的执行或许更快。因为distinct 最终是会合成一个reduce ,group by 可以多个。
A.Group By 效率优于 Distinct B.Group By + group 效率优于 Group By
hive>selectdistinctname,agefromtest; OK zhao14zhao15zhao16Timetaken:39.131seconds, Fetched:3row(s) hive>selectdistinct(name),agefromtest; OK zhao14zhao15zhao16Timetaken:37.739seconds, Fetched:3row(s) 区别 如果数据较多,distinct效率会更低一些,一般推荐使用group by。
1. Group by代替 count(distinct)的原因 当要统计某一列的去重数时,count(distinct)会非常慢。因为count(distinct)逻辑只会用很少的reducer来处理。此时可以用group by来改写: --原始sqlselectcount(distinct age)fromdemo;--优化后selectcount(1)from(selectidfromdemogroupby id)tmp; ...
两个查询,都会在map阶段count,但reduce阶段,distinct只有一个, group by 可以有多个进行并行聚合,所以group by会快。 但这个stackoverflow讨论中有人提出,当distinct后值很小时,distinct更快,因为在map完成了大部分的count。 所以,应该具体测试后决定其性能。
注意:在数据量很大的情况下,先使用group by去重再count()计数,效率要高于count(distinct *) 技巧二:利用窗口函数grouping sets、cube、rollup 1、GROUPING SETS():在group by查询中,根据不同的维度组合进行聚合,等价于 将不同维度的group by结果集进行union all。聚合规则在括号中进行指定。
因此,选择使用DISTINCT还是GROUP BY,应基于个人习惯与具体需求,不必过于纠结。以具体的例子说明,当我们使用Hive执行SQL时,优化器可能自动将带有DISTINCT的查询转换为使用GROUP BY的查询,如以下执行计划所示,使用了Group By Operator。这一转换体现了Hive在优化过程中,为提高执行效率而采取的策略。
Hive中数据去重的两种方式是使用DISTINCT关键字和GROUP BY子句。 DISTINCT关键字 使用DISTINCT关键字可以对某一列或多列的数据进行去重。它会返回唯一不同的值。 SELECTDISTINCTcolumn1,column2,...FROMtable_name; SQL Copy 这将返回在column1、column2等列中所有不重复的行。