hivesql 效率优化

1.group by 数据倾斜问题
   
   hive是根据group by 的key进行数据分发的,某个key相同的数据太多的会被分发到一个reducer上,key的数据分布不均匀会导致大量数据被shuffle到某个或者某些reducer上,出现严重的数据倾斜,使得数据计算变慢

   配置任务参数   set hive.groupby.skewindata=true;
  
   原理:该配置会触发hive增加额外的mr过程,随机化key后进行聚合操作得到中间结果,再对中间结果执行最终的聚合操作

   注意:count(distinct) 操作比较特殊,无法进行中间的聚合操作,因此该参数对有count(distinct)操作的sql不适用,如果有count(distinct)的需求可以优化sql,先进行一步group by进行变形

2.map优化

   大表join小表时候可以使用map join

   配置参数  set hive.auto.convert.join=true;

   原理:使用该配置,hive会自动识别比较小的表,继而用mapJoin来实现两个表的联合

3.count(distinct)优化

   是第一个问题的延伸,包含count(distinct)操作必须在一个reducer上完成,数据倾斜不能使用预聚合的方式进行优化

   配置参数:使用group by替代 count(distinct) 操作,使用group by将count(distinct)等价替换掉

 4.join 数据倾斜
  
   hive 根据 join key 对两边表的数据进行shuffle,若key数据分布不均匀会出现数据倾斜的现象

   优化方案:
   
   1.保证两种表的粒度是正确的,join key在至少至少一张表中是不重复的,否则会出现类似笛卡尔积的效果,造成数据膨胀

   2.如果join key是无意义的空值等,直接剔除掉再进行关联

   3.对join key 进行随机化处理

   set hive.mapred.mode=nonstrict;
   
   在join过程中对key进行随机化处理
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值