Hive的distinct和group by性能比较

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41455420/article/details/83388955

Hive的distinct和group by性能比较

Hive去重统计


当一个表的数据量非常大的时候,会发现一个简单的count(distinct order_no)这种语句跑的特别慢,和直接运行count(order_no)的时间差了很多。
在能使用group by代替distinc就不要使用distinct

验证


order_snap为订单的快照表 总记录条数763191489,即将近8亿条记录,总大小:108.877GB,表的字段大概有20个,其中订单号是没有重复的,所以在统计总共有多少订单号的时候去重不去重结果都一样。
统计所有的订单有多少条数,一个count函数就可以搞定的sql性能如何。

  • DISTINCT
select count(distinct order_no) from order_snap;
Stage-Stage-1: Map: 396 Reduce: 1 Cumulative CPU: 7915.67 sec HDFS Read: 119072894175 HDFS Write: 10 SUCCESS
Total MapReduce CPU Time Spent: 0 days 2 hours 11 minutes 55 seconds 670 msec
OK
_c0
763191489
Time taken: 1818.864 seconds, Fetched: 1 row(s)
  • GROUP BY
select count(t.order_no) from (select order_no from order_snap group by order_no) t;
Stage-Stage-1: Map: 396 Reduce: 457 Cumulative CPU: 10056.7 sec HDFS Read: 119074266583 HDFS Write: 53469 SUCCESS
Stage-Stage-2: Map: 177 Reduce: 1 Cumulative CPU: 280.22 sec HDFS Read: 472596 HDFS Write: 10 SUCCESS
Total MapReduce CPU Time Spent: 0 days 2 hours 52 minutes 16 seconds 920 msec
OK
_c0
763191489
Time taken: 244.192 seconds, Fetched: 1 row(s)

结论:第二种写法的性能是第一种的7.448499541

Hive在处理时产生了数据倾斜
使用distinct会将所有的order_no都shuffle到一个reducer里面,这就是数据倾斜,再看group by直接按订单号分组,起了457个reducer,将数据分布到多台机器上执行,处理速度就快了。

由于没有设置Reduce的个数,Hive会根据数据的大小动态的指定Reduce大小,也可以手动设置

set mapred.reduce.tasks=300;

喜欢就点赞评论+关注吧

感谢阅读,希望能帮助到大家,谢谢大家的支持!

猜你喜欢

转载自blog.csdn.net/qq_41455420/article/details/83388955