码迷,mamicode.com
首页 > 其他好文 > 详细

Hive语法层面优化之六数据倾斜常见案例

时间:2014-07-21 00:25:23      阅读:305      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   strong   数据   art   

常见案例一:空值产生的数据倾斜

日志表有一部分的user_id为空或者是0的情况,导致在用user_id进行hash分桶时,会将日志由user_id为0或者为空的数据分到一个reduce上,导致数据倾斜;

如:访户未登录时,日志中的user_id为空,用user_id和用户表的user_id进行关联的时候,会将日志中的user_id为空的数据分到一起,导致了过大的空key造成数据倾斜;

 

解决办法:随机函数解决数据倾斜

把空值的key变成一个字符串加上随机数(只要不与真正的end_user_id的格式相同即可),把倾斜的数据分发到不同的reduce上,由于null值关联不上用户表,处理后并不影响最终结果

        

案例: end_user 5000W数据,维度表; trackinfo 每日2亿,按日增量表;

原写法:

select u.id,  t.url,  t.track_time   from  end_user u
join
(select end_user_id,  url,  track_time   from trackinfo where ds=‘2013-12-01‘) t
on u.id=t.end_user_id limit 2;

注意事项:where条件最好别放在最后,而是放到某个子查询中或者on前,可以事先过滤掉一批数据

调整为:

select u.id, t.url, t.track_time from end_user u
join
(select 
  case when end_user_id=‘null‘ or end_user_id is null 
  then cast (concat(‘00000000‘,floor(rand()*1000000)) as bigint) 
  else end_user_id 
end as end_user_id ,
  url,track_time 
from trackinfo where ds=‘2013-07-21‘) t
on u.id=t.end_user_id limit 2;

在相同的集群中测试发现:后一种的写法比前一种的写法快差不多2倍;

 

CASE … WHEN … THEN Statements 案例:

SELECT empno, ename, sal,  
CASE  
WHEN sal <  1000.0 THEN ‘low‘  
WHEN sal >= 1000.0 AND sal <  1500.0 THEN ‘middle‘  
WHEN sal >= 1500.0 AND sal < 2000.0 THEN ‘high‘  
ELSE ‘very high‘  
END AS salary FROM emp;    

7369    SMITH   800.0   low
7499    ALLEN   1600.0  high
7521    WARD    1250.0  middle
7566    JONES   2975.0  very high
7654    MARTIN  1250.0  middle
7698    BLAKE   2850.0  very high
7782    CLARK   2450.0  very high
7788    SCOTT   3000.0  very high
7839    KING    5000.0  very high
7844    TURNER  1500.0  high
7876    ADAMS   1100.0  middle
7900    JAMES   950.0   low
7902    FORD    3000.0  very high
7934    MILLER  1300.0  middle

Hive语法层面优化之六数据倾斜常见案例,布布扣,bubuko.com

Hive语法层面优化之六数据倾斜常见案例

标签:style   blog   color   strong   数据   art   

原文地址:http://www.cnblogs.com/luogankun/p/3856591.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!