diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/TablePropertyEnrichmentOptimizer.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/TablePropertyEnrichmentOptimizer.java index d8067753b5..1217718e52 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/TablePropertyEnrichmentOptimizer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/TablePropertyEnrichmentOptimizer.java @@ -26,6 +26,7 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.metastore.api.Table; +import org.apache.hadoop.hive.metastore.utils.MetaStoreUtils; import org.apache.hadoop.hive.ql.exec.TableScanOperator; import org.apache.hadoop.hive.ql.lib.DefaultRuleDispatcher; import org.apache.hadoop.hive.ql.lib.Dispatcher; @@ -40,6 +41,7 @@ import org.apache.hadoop.hive.ql.parse.SemanticException; import org.apache.hadoop.hive.ql.plan.TableScanDesc; import org.apache.hadoop.hive.serde2.Deserializer; +import org.apache.hive.common.util.ReflectionUtil; import java.util.Arrays; import java.util.List; @@ -78,29 +80,48 @@ } } + private static Map getTableParameters(Table table) { + Map originalTableParameters = table.getParameters(); + Properties tableMetadata = MetaStoreUtils.getTableMetadata(table); + for (String property : tableMetadata.stringPropertyNames()) { + if (!originalTableParameters.containsKey(property)) { + originalTableParameters.put(property, tableMetadata.getProperty(property)); + } + } + return originalTableParameters; + } + private static class Processor implements NodeProcessor { @Override public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx, Object... nodeOutputs) throws SemanticException { TableScanOperator tsOp = (TableScanOperator) nd; WalkerCtx context = (WalkerCtx)procCtx; - TableScanDesc tableScanDesc = tsOp.getConf(); Table table = tsOp.getConf().getTableMetadata().getTTable(); - Map tableParameters = table.getParameters(); - Properties tableProperties = new Properties(); - tableProperties.putAll(tableParameters); - Deserializer deserializer = tableScanDesc.getTableMetadata().getDeserializer(); - String deserializerClassName = deserializer.getClass().getName(); + Map originalTableParameters = getTableParameters(table); + if (LOG.isDebugEnabled()) { + LOG.debug("Original Table parameters: " + originalTableParameters); + } + Properties clonedTableParameters = new Properties(); + clonedTableParameters.putAll(originalTableParameters); + + String deserializerClassName = null; try { + deserializerClassName = tableScanDesc.getTableMetadata().getSd().getSerdeInfo().getSerializationLib(); + Deserializer deserializer = ReflectionUtil.newInstance( + context.conf.getClassByName(deserializerClassName) + .asSubclass(Deserializer.class), + context.conf); + if (context.serdeClassesUnderConsideration.contains(deserializerClassName)) { - deserializer.initialize(context.conf, tableProperties); + deserializer.initialize(context.conf, clonedTableParameters); LOG.debug("SerDe init succeeded for class: " + deserializerClassName); - for (Map.Entry property : tableProperties.entrySet()) { - if (!property.getValue().equals(tableParameters.get(property.getKey()))) { + for (Map.Entry property : clonedTableParameters.entrySet()) { + if (!property.getValue().equals(originalTableParameters.get(property.getKey()))) { LOG.debug("Resolving changed parameters! key=" + property.getKey() + ", value=" + property.getValue()); - tableParameters.put((String) property.getKey(), (String) property.getValue()); + originalTableParameters.put((String) property.getKey(), (String) property.getValue()); } } }