HIVE-27161: MetaException when executing CTAS query in Druid storage handler (Krisztian Kasa, reviewed by Denys Kuzmenko)
diff --git a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java
index 6e9e987..985e7d4 100644
--- a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java
+++ b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java
@@ -73,6 +73,7 @@
import org.apache.hadoop.hive.ql.ddl.DDLOperationContext;
import org.apache.hadoop.hive.ql.ddl.table.AbstractAlterTableDesc;
import org.apache.hadoop.hive.ql.ddl.table.AlterTableType;
+import org.apache.hadoop.hive.ql.ddl.table.create.CreateTableDesc;
import org.apache.hadoop.hive.ql.ddl.table.create.like.CreateTableLikeDesc;
import org.apache.hadoop.hive.ql.ddl.table.misc.properties.AlterTableSetPropertiesDesc;
import org.apache.hadoop.hive.ql.exec.ColumnInfo;
@@ -1648,6 +1649,11 @@ public void setTableParametersForCTLT(org.apache.hadoop.hive.ql.metadata.Table t
}
@Override
+ public void setTableLocationForCTAS(CreateTableDesc desc, String location) {
+ desc.setLocation(location);
+ }
+
+ @Override
public Map<String, String> getNativeProperties(org.apache.hadoop.hive.ql.metadata.Table table) {
Table origTable = IcebergTableUtil.getTable(conf, table.getTTable());
Map<String, String> props = Maps.newHashMap();
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveStorageHandler.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveStorageHandler.java
index 9fe61c0..e9a0d13 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveStorageHandler.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveStorageHandler.java
@@ -24,7 +24,6 @@
import java.net.URISyntaxException;
import java.util.Collections;
import org.apache.hadoop.conf.Configurable;
-import org.apache.hadoop.hive.common.TableName;
import org.apache.hadoop.hive.common.classification.InterfaceAudience;
import org.apache.hadoop.hive.common.classification.InterfaceStability;
import org.apache.hadoop.hive.common.type.SnapshotContext;
@@ -43,6 +42,7 @@
import org.apache.hadoop.hive.ql.ErrorMsg;
import org.apache.hadoop.hive.ql.ddl.table.AbstractAlterTableDesc;
import org.apache.hadoop.hive.ql.ddl.table.AlterTableType;
+import org.apache.hadoop.hive.ql.ddl.table.create.CreateTableDesc;
import org.apache.hadoop.hive.ql.ddl.table.create.like.CreateTableLikeDesc;
import org.apache.hadoop.hive.ql.exec.ColumnInfo;
import org.apache.hadoop.hive.ql.hooks.WriteEntity;
@@ -379,6 +379,13 @@ default void setTableParametersForCTLT(org.apache.hadoop.hive.ql.metadata.Table
}
/**
+ * Sets tables physical location at create table as select.
+ * Some storage handlers requires specifying the location of tables others generates it internally.
+ */
+ default void setTableLocationForCTAS(CreateTableDesc desc, String location) {
+ }
+
+ /**
* Extract the native properties of the table which aren't stored in the HMS
* @param table the table
* @return map with native table level properties
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
index 2f38693..c1c0452 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
@@ -7949,7 +7949,8 @@ protected Operator genFileSinkPlan(String dest, QB qb, Operator input)
}
} else {
if (tblDesc.isCTAS() && tblDesc.getStorageHandler() != null) {
- tblDesc.setLocation(getCtasOrCMVLocation(tblDesc, viewDesc, createTableUseSuffix).toString());
+ tblDesc.toTable(conf).getStorageHandler().setTableLocationForCTAS(
+ tblDesc, getCtasOrCMVLocation(tblDesc, viewDesc, false).toString());
}
tableDescriptor = PlanUtils.getTableDesc(tblDesc, cols, colTypes);
}