hive性能优化使用group by替代distinct原理

日常业务统计中经常使用除重(distinct)操作,但是当出现某一组数据特别多时就会出现数据倾斜。于是在SQL编写的时候就使用group by来代替distinct,从而让执行效率提升。下面说一下个人的理解。
原始数据page_test表
原始数据
1.distinct底层实现原理(select city,count(distinct user_id) from page_test group by city)
distinct实现原理注意:1.在map端数据进行过除重操作,这就需要将每个处理过的数据保存起来。
2.distinct操作的map端的key为city+user_id(group by列+聚合函数count列)。
3.在数据进行Shuffle的时候分配到reduce的key为(group by列)。
2.group by底层实现原理(select city,user_id from page_test group by city,user_id)
group by底层实现原理注意:1.在map端数据进行过除重操作,这就需要将每个处理过的数据保存起来。
2.map端的key为city+user_id(group by列)并且value为空。
3.在数据进行Shuffle的时候分配到reduce的key为(group by列)。
通过上面的对比我们看出:
1.distinct每个reduce处理的数据比group by多。
2.distinc整个reduce数比group by少。
3.group by基本上没有进行reduce操作,可以直接通过shuffle sort就能得到结果(比如:hadoop二次排序就用到这个原理),同时还可以进行map端的聚合。
根据MapReduce模型的木桶效应可以看出group by效率比distinct要高。同时数据优化一个原则是让分配到reduce的key尽量随机化。可以借鉴HBASE对于key随机化的方法:加盐(随机数+key)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值