HQL一天一个小技巧:如何解决NULL值引发的数据倾斜

103 篇文章 221 订阅
98 篇文章 119 订阅

目录

0 需求描述

1 问题解决

2 小结


0 需求描述

实际业务中有些大量的null值或者一些无意义的数据参与到计算作业中,表中有大量的null值,如果表之间进行join操作,就会有shuffle产生,这样所有的null值都会被分配到一个reduce中,必然产生数据倾斜。

1 问题解决

(1)问题剖析

疑问:NULL值和需要匹配的字段根本就匹配不上,为什么会进入到同一个reduce?

数据放到同一个reduce中的原因不是因为字段能不能join上,而是因为shuffle阶段的数据分发操作(数据路由算法决定的),因为join中的key要进行匹配,在mr中此时key需要被分发,只要key的hash结果是一样的,它们就会被拉到同一个reduce中,被分到redcue中才进行下一步的关联操作,才能决定能不能匹配上。

(2)解决方案

第一种:可以直接不让null值参与join操作,即不让null值有shuffle阶段

SELECT *
FROM log a
LEFT JOIN users b
 ON a.user_id IS NOT NULL
  AND a.user_id = b.user_id
UNION ALL
SELECT *
FROM log a
WHERE a.user_id IS NULL;

第二种:因为null值参与shuffle时的hash结果是一样的,那么我们可以给null值随机赋值,这样它们的hash结果就不一样,就会进到不同的reduce中:

  
SELECT *
FROM log a
LEFT JOIN users b 
ON if(a.user_id is null,concat('hive',rand()),a.user_id)= b.user_id;

2 小结

本文讲述了在hivesql中如何解决NULL值引发的数据倾斜问题,其核心思路为一分为二思想,有null的单独过滤出不参与匹配,没NULL值的进行join匹配;另一种就是随机思想,将容易倾斜的key随机打散分到不同的redcue中而不是同一个reduce中。这两种思想是解决此类问题的核心思想。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值