You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by kg...@apache.org on 2019/07/09 15:46:58 UTC

[hive] 02/04: HIVE-21967: Clean up CreateTableLikeOperation (Miklos Gergely via Zoltan Haindrich)

This is an automated email from the ASF dual-hosted git repository.

kgyrtkirk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git

commit fb322b1b42739b842fc8c87ff260015d3e69dd45
Author: Miklos Gergely <mg...@hortonworks.com>
AuthorDate: Tue Jul 9 17:32:47 2019 +0200

    HIVE-21967: Clean up CreateTableLikeOperation (Miklos Gergely via Zoltan Haindrich)
    
    Signed-off-by: Zoltan Haindrich <ki...@rxd.hu>
---
 .../table/creation/CreateTableLikeOperation.java   | 137 ++++++++++-----------
 1 file changed, 62 insertions(+), 75 deletions(-)

diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/creation/CreateTableLikeOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/creation/CreateTableLikeOperation.java
index 57b756a..4837d44 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/creation/CreateTableLikeOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/creation/CreateTableLikeOperation.java
@@ -56,12 +56,12 @@ public class CreateTableLikeOperation extends DDLOperation<CreateTableLikeDesc>
   @Override
   public int execute() throws HiveException {
     // Get the existing table
-    Table oldtbl = context.getDb().getTable(desc.getLikeTableName());
+    Table oldTable = context.getDb().getTable(desc.getLikeTableName());
     Table tbl;
-    if (oldtbl.getTableType() == TableType.VIRTUAL_VIEW || oldtbl.getTableType() == TableType.MATERIALIZED_VIEW) {
-      tbl = createViewLikeTable(oldtbl);
+    if (oldTable.getTableType() == TableType.VIRTUAL_VIEW || oldTable.getTableType() == TableType.MATERIALIZED_VIEW) {
+      tbl = createViewLikeTable(oldTable);
     } else {
-      tbl = createTableLikeTable(oldtbl);
+      tbl = createTableLikeTable(oldTable);
     }
 
     // If location is specified - ensure that it is a full qualified name
@@ -81,82 +81,75 @@ public class CreateTableLikeOperation extends DDLOperation<CreateTableLikeDesc>
     return 0;
   }
 
-  private Table createViewLikeTable(Table oldtbl) throws HiveException {
-    Table tbl;
-    String targetTableName = desc.getTableName();
-    tbl = context.getDb().newTable(targetTableName);
+  private Table createViewLikeTable(Table oldTable) throws HiveException {
+    Table table = context.getDb().newTable(desc.getTableName());
 
     if (desc.getTblProps() != null) {
-      tbl.getTTable().getParameters().putAll(desc.getTblProps());
+      table.getTTable().getParameters().putAll(desc.getTblProps());
     }
 
-    tbl.setTableType(TableType.MANAGED_TABLE);
+    table.setTableType(TableType.MANAGED_TABLE);
 
     if (desc.isExternal()) {
-      tbl.setProperty("EXTERNAL", "TRUE");
-      tbl.setTableType(TableType.EXTERNAL_TABLE);
-      // if the partition discovery tablproperty is already defined don't change it
-      if (tbl.isPartitioned() && tbl.getProperty(PartitionManagementTask.DISCOVER_PARTITIONS_TBLPROPERTY) == null) {
-        // partition discovery is on by default if it already doesn't exist
-        tbl.setProperty(PartitionManagementTask.DISCOVER_PARTITIONS_TBLPROPERTY, "true");
-      }
+      setExternalProperties(table);
     }
 
-    tbl.setFields(oldtbl.getCols());
-    tbl.setPartCols(oldtbl.getPartCols());
-
-    if (desc.getDefaultSerName() == null) {
-      LOG.info("Default to LazySimpleSerDe for table {}", targetTableName);
-      tbl.setSerializationLib(LazySimpleSerDe.class.getName());
-    } else {
-      // let's validate that the serde exists
-      DDLUtils.validateSerDe(desc.getDefaultSerName(), context);
-      tbl.setSerializationLib(desc.getDefaultSerName());
-    }
+    table.setFields(oldTable.getCols());
+    table.setPartCols(oldTable.getPartCols());
 
     if (desc.getDefaultSerdeProps() != null) {
       for (Map.Entry<String, String> e : desc.getDefaultSerdeProps().entrySet()) {
-        tbl.setSerdeParam(e.getKey(), e.getValue());
+        table.setSerdeParam(e.getKey(), e.getValue());
       }
     }
 
-    tbl.setInputFormatClass(desc.getDefaultInputFormat());
-    tbl.setOutputFormatClass(desc.getDefaultOutputFormat());
-    tbl.getTTable().getSd().setInputFormat(tbl.getInputFormatClass().getName());
-    tbl.getTTable().getSd().setOutputFormat(tbl.getOutputFormatClass().getName());
+    setStorage(table);
 
-    return tbl;
+    return table;
   }
 
-  private Table createTableLikeTable(Table oldtbl) throws SemanticException, HiveException {
-    Table tbl = oldtbl;
+  private Table createTableLikeTable(Table table) throws SemanticException, HiveException {
+    String[] names = Utilities.getDbTableName(desc.getTableName());
+    table.setDbName(names[0]);
+    table.setTableName(names[1]);
+    table.setOwner(SessionState.getUserFromAuthenticator());
 
-    // find out database name and table name of target table
-    String targetTableName = desc.getTableName();
-    String[] names = Utilities.getDbTableName(targetTableName);
+    if (desc.getLocation() != null) {
+      table.setDataLocation(new Path(desc.getLocation()));
+    } else {
+      table.unsetDataLocation();
+    }
 
-    tbl.setDbName(names[0]);
-    tbl.setTableName(names[1]);
+    setTableParameters(table);
+
+    if (desc.isUserStorageFormat()) {
+      setStorage(table);
+    }
 
-    // using old table object, hence reset the owner to current user for new table.
-    tbl.setOwner(SessionState.getUserFromAuthenticator());
+    table.getTTable().setTemporary(desc.isTemporary());
+    table.getTTable().unsetId();
 
-    if (desc.getLocation() != null) {
-      tbl.setDataLocation(new Path(desc.getLocation()));
+    if (desc.isExternal()) {
+      setExternalProperties(table);
     } else {
-      tbl.unsetDataLocation();
+      table.getParameters().remove("EXTERNAL");
     }
 
+    return table;
+  }
+
+  private void setTableParameters(Table tbl) throws HiveException {
+    Set<String> retainer = new HashSet<String>();
+
     Class<? extends Deserializer> serdeClass;
     try {
-      serdeClass = oldtbl.getDeserializerClass();
+      serdeClass = tbl.getDeserializerClass();
     } catch (Exception e) {
       throw new HiveException(e);
     }
     // We should copy only those table parameters that are specified in the config.
     SerDeSpec spec = AnnotationUtils.getAnnotation(serdeClass, SerDeSpec.class);
 
-    Set<String> retainer = new HashSet<String>();
     // for non-native table, property storage_handler should be retained
     retainer.add(META_TABLE_STORAGE);
     if (spec != null && spec.schemaProps() != null) {
@@ -178,37 +171,31 @@ public class CreateTableLikeOperation extends DDLOperation<CreateTableLikeDesc>
     if (desc.getTblProps() != null) {
       params.putAll(desc.getTblProps());
     }
+  }
 
-    if (desc.isUserStorageFormat()) {
-      tbl.setInputFormatClass(desc.getDefaultInputFormat());
-      tbl.setOutputFormatClass(desc.getDefaultOutputFormat());
-      tbl.getTTable().getSd().setInputFormat(tbl.getInputFormatClass().getName());
-      tbl.getTTable().getSd().setOutputFormat(tbl.getOutputFormatClass().getName());
-      if (desc.getDefaultSerName() == null) {
-        LOG.info("Default to LazySimpleSerDe for like table {}", targetTableName);
-        tbl.setSerializationLib(LazySimpleSerDe.class.getName());
-      } else {
-        // let's validate that the serde exists
-        DDLUtils.validateSerDe(desc.getDefaultSerName(), context);
-        tbl.setSerializationLib(desc.getDefaultSerName());
-      }
-    }
-
-    tbl.getTTable().setTemporary(desc.isTemporary());
-    tbl.getTTable().unsetId();
+  private void setStorage(Table table) throws HiveException {
+    table.setInputFormatClass(desc.getDefaultInputFormat());
+    table.setOutputFormatClass(desc.getDefaultOutputFormat());
+    table.getTTable().getSd().setInputFormat(table.getInputFormatClass().getName());
+    table.getTTable().getSd().setOutputFormat(table.getOutputFormatClass().getName());
 
-    if (desc.isExternal()) {
-      tbl.setProperty("EXTERNAL", "TRUE");
-      tbl.setTableType(TableType.EXTERNAL_TABLE);
-      // if the partition discovery tablproperty is already defined don't change it
-      if (tbl.isPartitioned() && tbl.getProperty(PartitionManagementTask.DISCOVER_PARTITIONS_TBLPROPERTY) == null) {
-        // partition discovery is on by default if it already doesn't exist
-        tbl.setProperty(PartitionManagementTask.DISCOVER_PARTITIONS_TBLPROPERTY, "true");
-      }
+    if (desc.getDefaultSerName() == null) {
+      LOG.info("Default to LazySimpleSerDe for table {}", desc.getTableName());
+      table.setSerializationLib(LazySimpleSerDe.class.getName());
     } else {
-      tbl.getParameters().remove("EXTERNAL");
+      // let's validate that the serde exists
+      DDLUtils.validateSerDe(desc.getDefaultSerName(), context);
+      table.setSerializationLib(desc.getDefaultSerName());
     }
+  }
 
-    return tbl;
+  private void setExternalProperties(Table tbl) {
+    tbl.setProperty("EXTERNAL", "TRUE");
+    tbl.setTableType(TableType.EXTERNAL_TABLE);
+    // if the partition discovery table property is already defined don't change it
+    if (tbl.isPartitioned() && tbl.getProperty(PartitionManagementTask.DISCOVER_PARTITIONS_TBLPROPERTY) == null) {
+      // partition discovery is on by default if it already doesn't exist
+      tbl.setProperty(PartitionManagementTask.DISCOVER_PARTITIONS_TBLPROPERTY, "true");
+    }
   }
 }