目录
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中。这两种思想是解决此类问题的核心思想。