有时虽然某个
key
为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在
join
的结果中,此时我们可以表
a
中
key
为空的字段赋一个随机的值,使得数据随机均匀地
分不到不同的
reducer
上。例如:
案例实操:
不随机分布空
null
值:
(1)设置
5
个
reduce
个数
set mapreduce.job.reduces = 5;
(2)
JOIN
两张表
insert overwrite table jointable
select n.* from nullidtable n left join bigtable b on n.id = b.id;
结果:如下图所示,可以看出来,出现了数据倾斜,某些
reducer
的资源消耗远大于其
他
reducer
。
随机分布空
null
值
(1)设置
5
个
reduce
个数
set mapreduce.job.reduces = 5;
(2)
JOIN
两张表
insert overwrite table jointable
select n.* from nullidtable n full join bigtable o on
nvl(n.id,rand()) = o.id;
结果:如下图所示,可以看出来,消除了数据倾斜,负载均衡
reducer
的资源消耗
3)SMB(Sort Merge Bucket join)
(1)创建第二张大表
测试大表直接 JOIN
(2)创建分通表 1,桶的个数不要超过可用 CPU 的核数
(3)创建分通表
2,
桶的个数不要超过可用
CPU
的核数
(4)设置参数
(5)测试