RICH-ATONE

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编辑  收藏  举报

导航