Hive:如何解决NULL值引发的数据倾斜
实际业务中有些大量的null值或者一些无意义的数据参与到计算作业中,表中有大量的null值,如果表之间进行join操作,就会有shuffle产生,这样所有的null值都会被分配到一个reduce中,必然产生数据倾斜。
疑问:NULL值和需要匹配的字段根本就匹配不上,为什么会进入到同一个reduce?
数据放到同一个reduce中的原因不是因为字段能不能join上,而是因为shuffle阶段的数据分发操作(数据路由算法决定的),因为join中的key要进行匹配,在mr中此时key需要被分发,只要key的hash结果是一样的,
它们就会被拉到同一个reduce中,被分到redcue中才进行下一步的关联操作,才能决定能不能匹配上。
在hivesql中如何解决NULL值引发的数据倾斜问题,
其核心思路为一分为二思想,有null的单独过滤出不参与匹配,没NULL值的进行join匹配;另一种就是随机思想,将容易倾斜的key随机打散分到不同的redcue中而不是同一个reduce中。这两种思想是解决此类问题的核心思想。
数据倾斜产生原因
我们以Spark和Hive的使用场景为例。
他们在做数据运算的时候会涉及到,count distinct、group by、join on等操作,这些都会触发Shuffle动作。一旦触发Shuffle,所有相同key的值就会被拉到一个或几个Reducer节点上,容易发生单点计算问题,导致数据倾斜;
解决数据倾斜思路
很多数据倾斜的问题,都可以用和平台无关的方式解决,比如更好的数据预处理,异常值的过滤等。因此,解决数据倾斜的重点在于对数据设计和业务的理解,这两个搞清楚了,数据倾斜就解决了大部分了。
参考:https://blog.csdn.net/godlovedaniel/article/details/120013331
拓展:Hive的NULL值和空值关联拓展:
结论:NULL值关联不到,但是空字符串会关联到数据
示例:
创建两个表,关联键有空值和null值
表1:
CREATE TABLE GCZHU.ZGC_TEST_0708 AS SELECT 1001 AS ID,50 AS NUM UNION ALL SELECT '' AS ID,60 AS NUM UNION ALL SELECT NULL AS ID,70 AS NUM;
表2:
CREATE TABLE GCZHU.ZGC_TEST_070802 AS SELECT 1001 AS ID,777 AS SCORE UNION ALL SELECT '' AS ID,999 AS SCORE UNION ALL SELECT NULL AS ID,555 AS SCORE;
运行JOIN结果:
SELECT A.*,B.SCORE FROM GCZHU.ZGC_TEST_0708 A LEFT JOIN GCZHU.ZGC_TEST_070802 B ON A.ID = B.ID 结果: NULL 70 NULL 60 999 1001 50 777
posted on 2022-05-10 16:26 RICH-ATONE 阅读(1121) 评论(0) 编辑 收藏 举报