hive数据倾斜可能的原因有哪些?主要解决方法有哪些?
1:数据倾斜多由于脏数据/特殊数据 (某一类数据集中)
2:大小表join
3:小文件过多;
1:脏数据不参与关联,给特数据数据做随机(建表时)
2:使用mapjoin将小表加入内存。
3:合并小文件,通过set hive.merge.mapredfiles=true 解决;或者增加map数;(计算量大)
解决方法1:id为空的不参与关联
比如:select * from log a
join users b
on a.id is not null and a.id = b.id
union all
select * from log a
where a.id is null;
解决方法2:给空值分配随机的key值
如:select * from log a
left outer join users b
on
case when a.user_id is null
then concat(‘hive’,rand() )
else a.user_id end = b.user_id;
students_info(stu_id,name,depart);
1、张三、语文
1、张三、数学
1、张三、英语
2、李四、语文
2、李四、数学
实现:
1、张三、语文|数学|英语
2、李四、语文|数学
select stu_id,name,concat_ws(‘|‘,collect_set(depart)) as departs from students_info group by stu_id;
1: group by
2:collect_set 打平放成set
3: concat_ws 连接
students_info(stu_id,name,departs);
1、张三、语文|数学|英语
2、李四、语文|数学
实现:
1、张三、语文
1、张三、数学
1、张三、英语
2、李四、语文
2、李四、数学
select stu_id, name,depart from students_info lateral view explode(split(depart,‘|‘)) as depart;
1: 拆成数组(split),如果是数组类型的,不需要。 Array
2: 把数组分行(explode)
3: 虚拟分行数据为视图 (记得别称),同时放置到查询里。
海量数据处理,10亿个数中找出最大的10000个数, 知道几种说几种。
求班级分数高的,求前20%高的
users uid bigint, tags array
订单表:城区、区域、品类、金额:
交易表 trade_info(iterm_id,shop_id,sales,price,dt),门店表:shop_info (shop_id,provice,city)
原文:https://www.cnblogs.com/cphmvp/p/14674886.html