diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/tez/HashTableLoader.java ql/src/java/org/apache/hadoop/hive/ql/exec/tez/HashTableLoader.java index f7d165a..8a3647c 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/tez/HashTableLoader.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/tez/HashTableLoader.java @@ -21,6 +21,7 @@ import java.lang.management.ManagementFactory; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; @@ -38,6 +39,7 @@ import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainerSerDe; import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; import org.apache.hadoop.hive.ql.plan.MapJoinDesc; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category; @@ -77,6 +79,12 @@ public void load(MapJoinTableContainer[] mapJoinTables, Map parentToInput = desc.getParentToInput(); Map parentKeyCounts = desc.getParentKeyCounts(); + boolean isCrossProduct = false; + List joinExprs = desc.getKeys().values().iterator().next(); + if (joinExprs.size() == 0) { + isCrossProduct = true; + } + boolean useOptimizedTables = HiveConf.getBoolVar( hconf, HiveConf.ConfVars.HIVEMAPJOINUSEOPTIMIZEDTABLE); boolean useHybridGraceHashJoin = desc.isHybridHashJoin(); @@ -184,11 +192,18 @@ public void load(MapJoinTableContainer[] mapJoinTables, } } - MapJoinTableContainer tableContainer = useOptimizedTables - ? (useHybridGraceHashJoin ? new HybridHashTableContainer(hconf, keyCount, - memory, desc.getParentDataSizes().get(pos), nwayConf) - : new MapJoinBytesTableContainer(hconf, valCtx, keyCount, 0)) - : new HashMapWrapper(hconf, keyCount); + MapJoinTableContainer tableContainer; + if (useOptimizedTables) { + if (!useHybridGraceHashJoin || isCrossProduct) { + tableContainer = new MapJoinBytesTableContainer(hconf, valCtx, keyCount, 0); + } else { + tableContainer = new HybridHashTableContainer(hconf, keyCount, memory, + desc.getParentDataSizes().get(pos), nwayConf); + } + } else { + tableContainer = new HashMapWrapper(hconf, keyCount); + } + LOG.info("Using tableContainer " + tableContainer.getClass().getSimpleName()); while (kvReader.next()) {