解决数据倾斜问题

方法:解决数据倾斜问题

解决方法1. User_id为空的不参与关联,例如:

1
2
3
4
5
6
7
8
9
Select *
From log a
Join  bmw_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.

解决方法2 :

1
2
3
4
Select *
from log a
left outer join bmw_users b
on case when a.user_id is null then concat(‘dp_hive’,rand() ) else a.user_id end = b.user_id;


 

总结:2比1效率更好,不但io少了,而且作业数也少了。1方法log读取两次,jobs是2。2方法job数是1 。这个优化适合无效id(比如-99,’’,null等)产生的倾斜问题。把空值的key变成一个字符串加上随机数,就能把倾斜的数据分到不同的reduce上 ,解决数据倾斜问题。因为空值不参与关联,即使分到不同的reduce上,也不影响最终的结果。附上hadoop通用关联的实现方法(关联通过二次排序实现的,关联的列为parition key,关联的列c1和表的tag组成排序的group key,根据parition key分配reduce。同一reduce内根据group key排序)。

1
<br>










本文转自 yntmdr 51CTO博客,原文链接:http://blog.51cto.com/yntmdr/1774319,如需转载请自行联系原作者
上一篇:​老男孩教育每日一题-第125天-显示文件oldboy.txt的第20行到30行请问如何做?


下一篇:常用字符与ASCII代码对照表