Hive在reduce的过程中会将相同的key放入同一个reduce处理,当某个key的数据量过大时就会发生数据倾斜。
两个表进行join时,数据量大的key称为skew key,此时可以通过以下参数对这种情况进行优化:
1.hive.optimize.skewjoin=true (default :false)
该参数通过在Hive 对物理执行计划优化时 ,添加一个Map Join用于处理Skew Key ;
目前该优化方案还不支持outer join,并且数据倾斜的key出现在join的最后一张表时不会触发skew key优化,如:select a.* , b.* from table_a a join table_b b on a.id =b.id,如果倾斜key 在表b的时候是不会被优化成skew join的, 如果出现在表 a 则会;
2.hive.skewjoin.key = <判断key为Skew key 的阈值> (default : 100000)
在参数 hive.optimize.skewjoin=true 时, Hive的reuce 任务会在处理join key 的时候 判断其数量是否大于该 阈值,如果是将作为一个Skew Join 处理
3.hive.skewjoin.mapjoin.map.tasks = <用于处理skew join的map join 的最大数量> (defaul : 10000)
参考博客:Hive优化—skew join优化原理详解_看得出的就是的博客-CSDN博客