diff --git hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseStorageHandler.java hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseStorageHandler.java index dbf5e51..0fbc3c3 100644 --- hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseStorageHandler.java +++ hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseStorageHandler.java @@ -473,4 +473,22 @@ public static DecomposedPredicate decomposePredicate( decomposedPredicate.residualPredicate = residualPredicate; return decomposedPredicate; } + + @Override + public void truncateTable(Table table) throws MetaException { + String tableName = getHBaseTableName(table); + try { + HBaseAdmin admin = getHBaseAdmin(); + HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(tableName)); + if (admin.tableExists(tableName)) { + if (admin.isTableEnabled(tableName)) { + admin.disableTable(tableName); + } + admin.deleteTable(tableName); + admin.createTable(tableDesc); + } + } catch (IOException ie) { + throw new MetaException(StringUtils.stringifyException(ie)); + } + } } diff --git hbase-handler/src/test/queries/positive/hbase_queries.q hbase-handler/src/test/queries/positive/hbase_queries.q index 9ea9b1a..17da0a4 100644 --- hbase-handler/src/test/queries/positive/hbase_queries.q +++ hbase-handler/src/test/queries/positive/hbase_queries.q @@ -148,6 +148,9 @@ FROM src WHERE key=98 OR key=100; SELECT * FROM hbase_table_8 ORDER BY key; +truncate table hbase_table_8; +SELECT * FROM hbase_table_8; + DROP TABLE hbase_table_1; DROP TABLE hbase_table_2; DROP TABLE hbase_table_3; diff --git hbase-handler/src/test/results/positive/hbase_queries.q.out hbase-handler/src/test/results/positive/hbase_queries.q.out index ab06ab7..0077a41 100644 --- hbase-handler/src/test/results/positive/hbase_queries.q.out +++ hbase-handler/src/test/results/positive/hbase_queries.q.out @@ -814,6 +814,20 @@ POSTHOOK: Input: default@hbase_table_8 #### A masked pattern was here #### 98 val_98 99 100 100 val_100 101 102 +PREHOOK: query: truncate table hbase_table_8 +PREHOOK: type: TRUNCATETABLE +PREHOOK: Output: default@hbase_table_8 +POSTHOOK: query: truncate table hbase_table_8 +POSTHOOK: type: TRUNCATETABLE +POSTHOOK: Output: default@hbase_table_8 +PREHOOK: query: SELECT * FROM hbase_table_8 +PREHOOK: type: QUERY +PREHOOK: Input: default@hbase_table_8 +#### A masked pattern was here #### +POSTHOOK: query: SELECT * FROM hbase_table_8 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@hbase_table_8 +#### A masked pattern was here #### PREHOOK: query: DROP TABLE hbase_table_1 PREHOOK: type: DROPTABLE PREHOOK: Input: default@hbase_table_1 diff --git metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaHook.java metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaHook.java index 570b358..9e7e125 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaHook.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaHook.java @@ -19,7 +19,6 @@ package org.apache.hadoop.hive.metastore; import org.apache.hadoop.hive.metastore.api.MetaException; -import org.apache.hadoop.hive.metastore.api.Partition; import org.apache.hadoop.hive.metastore.api.Table; /** @@ -89,4 +88,12 @@ public void rollbackDropTable(Table table) */ public void commitDropTable(Table table, boolean deleteData) throws MetaException; + + /** + * Called for truncate table + * + * @param table table definition + * @throws MetaException + */ + public void truncateTable(Table table) throws MetaException; } diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java index d8d900b..5e178ff 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java @@ -56,6 +56,7 @@ import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.conf.HiveConf.ConfVars; +import org.apache.hadoop.hive.metastore.HiveMetaHook; import org.apache.hadoop.hive.metastore.MetaStoreUtils; import org.apache.hadoop.hive.metastore.ProtectMode; import org.apache.hadoop.hive.metastore.TableType; @@ -4490,6 +4491,18 @@ private int truncateTable(Hive db, TruncateTableDesc truncateTableDesc) throws H Table table = db.getTable(tableName, true); + if (table.isNonNative()) { + HiveMetaHook metaHook = table.getStorageHandler().getMetaHook(); + try { + metaHook.truncateTable(table.getTTable()); + } catch (MetaException e) { + throw new HiveException(e.toString(), e); + } catch (UnsupportedOperationException e) { + throw new HiveException(ErrorMsg.TRUNCATE_FOR_NON_NATIVE_TABLE.format(tableName)); + } + return 0; + } + try { // this is not transactional for (Path location : getLocations(db, table, partSpec)) { diff --git ql/src/java/org/apache/hadoop/hive/ql/metadata/DefaultStorageHandler.java ql/src/java/org/apache/hadoop/hive/ql/metadata/DefaultStorageHandler.java index e183bf3..38dc9f9 100644 --- ql/src/java/org/apache/hadoop/hive/ql/metadata/DefaultStorageHandler.java +++ ql/src/java/org/apache/hadoop/hive/ql/metadata/DefaultStorageHandler.java @@ -22,6 +22,7 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.metastore.HiveMetaHook; +import org.apache.hadoop.hive.metastore.api.MetaException; import org.apache.hadoop.hive.ql.plan.TableDesc; import org.apache.hadoop.hive.serde2.SerDe; import org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe; @@ -101,8 +102,13 @@ public Configuration getConf() { public void setConf(Configuration conf) { this.conf = conf; } + @Override public String toString() { return this.getClass().getName(); } + + public void truncateTable(org.apache.hadoop.hive.metastore.api.Table table) throws MetaException { + throw new UnsupportedOperationException("truncateTable"); + } } diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java index 640b6b3..a3ec60d 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java @@ -826,8 +826,8 @@ private void analyzeTruncateTable(ASTNode ast) throws SemanticException { if (table.getTableType() != TableType.MANAGED_TABLE) { throw new SemanticException(ErrorMsg.TRUNCATE_FOR_NON_MANAGED_TABLE.format(tableName)); } - if (table.isNonNative()) { - throw new SemanticException(ErrorMsg.TRUNCATE_FOR_NON_NATIVE_TABLE.format(tableName)); //TODO + if (table.isNonNative() && table.getStorageHandler().getMetaHook() == null) { + throw new SemanticException(ErrorMsg.TRUNCATE_FOR_NON_NATIVE_TABLE.format(tableName)); } if (!table.isPartitioned() && root.getChildCount() > 1) { throw new SemanticException(ErrorMsg.PARTSPEC_FOR_NON_PARTITIONED_TABLE.format(tableName));