但是执行效率上,group by的执行或许更快。因为distinct 最终是会合成一个reduce ,group by 可以多个。
Group By Operator// 分组聚合操作aggregations:count(DISTINCT age)// 聚合函数keys:age(type:int)// 分组的字段mode:hash// 聚合模式,值有 hash:随机聚合,就是hash partition;partial:局部聚合;final:最终聚合outputColumnNames:_col0,_col1// 聚合之后输出列名Statistics:Num rows:126172096Data size:504688384Bas...
两个查询,都会在map阶段count,但reduce阶段,distinct只有一个, group by 可以有多个进行并行聚合,所以group by会快。 但这个stackoverflow讨论中有人提出,当distinct后值很小时,distinct更快,因为在map完成了大部分的count。 所以,应该具体测试后决定其性能。
先说结论:能使用group by代替distinc就不要使用distinct,例子:
hive>selectdistinctname,agefromtest; OK zhao14zhao15zhao16Timetaken:39.131seconds, Fetched:3row(s) hive>selectdistinct(name),agefromtest; OK zhao14zhao15zhao16Timetaken:37.739seconds, Fetched:3row(s) 区别 如果数据较多,distinct效率会更低一些,一般推荐使用group by。
注意:在数据量很大的情况下,先使用group by去重再count()计数,效率要高于count(distinct *) 技巧二:利用窗口函数grouping sets、cube、rollup 1、GROUPING SETS():在group by查询中,根据不同的维度组合进行聚合,等价于 将不同维度的group by结果集进行union all。聚合规则在括号中进行指定。
group by 可以将数据分组再聚合,适合数据量比较大的场景,在数据很大的情况下效率优于 distinct。 编辑 任务开始时间为 2022-05-16 13:00:30,大概执行时间为 1小时,可以看到同样数据大小(大数据量)的情况下,groupby 的性能优于 distinct。 三.Distinct & 分组 ...
使用count(distict()):在数据量大的情况下,效率较低,如果多COUNT(DISTINCT)效率更低,因为COUNT(DISTINCT)是按GROUP BY字段分组,按DISTINCT字段排序,一般这种分布式方式是很倾斜的;比如:男UV,女UV,淘宝一天30亿的PV,如果按性别分组,分配2个reduce,每个reduce处理15亿数据。
因此,选择使用DISTINCT还是GROUP BY,应基于个人习惯与具体需求,不必过于纠结。以具体的例子说明,当我们使用Hive执行SQL时,优化器可能自动将带有DISTINCT的查询转换为使用GROUP BY的查询,如以下执行计划所示,使用了Group By Operator。这一转换体现了Hive在优化过程中,为提高执行效率而采取的策略。