public static boolean isFullOuterMapEnabled(HiveConf hiveConf, JoinOperator joinOp)
      throws SemanticException {

    final String testMapJoinFullOuterOverrideString =
        HiveConf.getVar(hiveConf,
            HiveConf.ConfVars.HIVE_TEST_MAPJOINFULLOUTER_OVERRIDE);
    EnabledOverride mapJoinFullOuterOverride =
        EnabledOverride.NAME_MAP.get(testMapJoinFullOuterOverrideString);

    final boolean isEnabled =
        HiveConf.getBoolVar(
            hiveConf,
            HiveConf.ConfVars.HIVE_MAPJOIN_FULL_OUTER);
    switch (mapJoinFullOuterOverride) {
    case NONE:
      {
        if (!isEnabled) {
          LOG.debug("FULL OUTER MapJoin not enabled: {} is false", HiveConf.ConfVars.HIVE_MAPJOIN_FULL_OUTER.varname);
          return false;
        }
      }
      break;
    case DISABLE:
      if (LOG.isDebugEnabled()) {
        LOG.debug("FULL OUTER MapJoin not enabled: " +
            HiveConf.ConfVars.HIVE_TEST_MAPJOINFULLOUTER_OVERRIDE.varname + " is disable (" +
            " " + HiveConf.ConfVars.HIVE_MAPJOIN_FULL_OUTER.varname + " is " + isEnabled + ")");
      }
      return false;
    case ENABLE:

      // Different parts of the code may rely on this being set...
      HiveConf.setBoolVar(hiveConf,
          HiveConf.ConfVars.HIVE_MAPJOIN_FULL_OUTER, true);
      if (LOG.isDebugEnabled()) {
        LOG.debug("FULL OUTER MapJoin is enabled: " +
            HiveConf.ConfVars.HIVE_TEST_MAPJOINFULLOUTER_OVERRIDE.varname + " is enable (" +
            " " + HiveConf.ConfVars.HIVE_MAPJOIN_FULL_OUTER.varname + " is " + isEnabled + ")");
      }
      break;
    default:
      throw new RuntimeException("Unexpected vectorization enabled override " +
          mapJoinFullOuterOverride);
    }

    final String engine =
        HiveConf.getVar(
            hiveConf,
            HiveConf.ConfVars.HIVE_EXECUTION_ENGINE);
    final boolean isTezEngine = engine.equalsIgnoreCase("tez");
    if (!isTezEngine) {

      // Only Tez for now.
      LOG.debug("FULL OUTER MapJoin not enabled: Only Tez engine supported");
      return false;
    }

    /*
     * Optimized Hash Table (i.e. not old-style MR HashMap).
     */
    final boolean isOptimizedHashTableEnabled =
        HiveConf.getBoolVar(
            hiveConf,
            HiveConf.ConfVars.HIVE_MAPJOIN_USE_OPTIMIZED_TABLE);
    if (!isOptimizedHashTableEnabled) {
      LOG.debug("FULL OUTER MapJoin not enabled: {} is false", HiveConf.ConfVars.HIVE_MAPJOIN_USE_OPTIMIZED_TABLE.varname);
      return false;
    }

    boolean isCompatibleFullOuterMapJoin = checkFullOuterMapJoinCompatible(hiveConf, joinOp);
    if (!isCompatibleFullOuterMapJoin) {
      return false;
    }

    LOG.debug("FULL OUTER MapJoin enabled");
    return true;
  }
convert a regular join to a a map-side join.

@param op
         join operator
@param mapJoinPos
         position of the source to be read as part of map-reduce framework. All other sources
         are cached in memory
@param noCheckOuterJoin
@param validateMapJoinTree
ql/src/java/org/apache/hadoop/hive/ql/optimizer/MapJoinProcessor.java