hive.optimize.skewjoin:hive 程序使用不同的mr job处理倾斜的key和正常的key,然后将处理的结果uion all。
    对于倾斜的key,hive程序是使用map join进行处理的。开启hive.optimize.skewjoin=true参数,只对inner join有效,对于left join、right join、full join是无效的。

    GenMRSkewJoinProcessor.processSkewJoin()关键代码:

    1. if (!GenMRSkewJoinProcessor.skewJoinEnabled(parseCtx.getConf(), joinOp)) {
    2. return;
    3. }

    GenMRSkewJoinProcessor.skewJoinEnabled()代码:

    1. public static boolean skewJoinEnabled(HiveConf conf, JoinOperator joinOp) {
    2. if (conf != null && !conf.getBoolVar(HiveConf.ConfVars.HIVESKEWJOIN)) {
    3. return false;
    4. }
    5. //不支持outer join
    6. if (!joinOp.getConf().isNoOuterJoin()) {
    7. return false;
    8. }
    9. byte pos = 0;
    10. for (Byte tag : joinOp.getConf().getTagOrder()) {
    11. if (tag != pos) {
    12. return false;
    13. }
    14. pos++;
    15. }
    16. return true;
    17. }