You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jd...@apache.org on 2018/06/05 00:10:35 UTC

hive git commit: HIVE-19332: Disable compute.query.using.stats for external table (Jason Dere, reviewed by Ashutosh Chauhan)

Repository: hive
Updated Branches:
  refs/heads/master bf70bd270 -> 85ac54403


HIVE-19332: Disable compute.query.using.stats for external table (Jason Dere, reviewed by Ashutosh Chauhan)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/85ac5440
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/85ac5440
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/85ac5440

Branch: refs/heads/master
Commit: 85ac544039b7620c41dcc0c743b7cb603cefe26a
Parents: bf70bd2
Author: Jason Dere <jd...@hortonworks.com>
Authored: Mon Jun 4 17:10:01 2018 -0700
Committer: Jason Dere <jd...@hortonworks.com>
Committed: Mon Jun 4 17:10:01 2018 -0700

----------------------------------------------------------------------
 .../test/resources/testconfiguration.properties |   1 +
 .../hive/ql/optimizer/StatsOptimizer.java       |  17 +-
 .../HiveReduceExpressionsWithStatsRule.java     |   7 +-
 .../apache/hadoop/hive/ql/stats/StatsUtils.java |  25 ++
 .../clientpositive/stats_only_external.q        |  35 +++
 .../llap/stats_only_external.q.out              | 227 +++++++++++++++++++
 6 files changed, 301 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/85ac5440/itests/src/test/resources/testconfiguration.properties
----------------------------------------------------------------------
diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties
index fa1a4fb..14a93a1 100644
--- a/itests/src/test/resources/testconfiguration.properties
+++ b/itests/src/test/resources/testconfiguration.properties
@@ -670,6 +670,7 @@ minillaplocal.query.files=\
   special_character_in_tabnames_1.q,\
   sqlmerge.q,\
   stats_based_fetch_decision.q,\
+  stats_only_external.q,\
   subquery_in_having.q,\
   subquery_notin.q,\
   subquery_nested_subquery.q, \

http://git-wip-us.apache.org/repos/asf/hive/blob/85ac5440/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java
index 5788d49..857f300 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java
@@ -59,6 +59,7 @@ import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
 import org.apache.hadoop.hive.ql.plan.ExprNodeDescUtils;
 import org.apache.hadoop.hive.ql.plan.FetchWork;
 import org.apache.hadoop.hive.ql.plan.GroupByDesc;
+import org.apache.hadoop.hive.ql.stats.StatsUtils;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFCount;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFMax;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFMin;
@@ -447,7 +448,7 @@ public class StatsOptimizer extends Transform {
               String colName = desc.getColumn();
               StatType type = getType(desc.getTypeString());
               if (!tbl.isPartitioned()) {
-                if (!StatsSetupConst.areBasicStatsUptoDate(tbl.getParameters())) {
+                if (!StatsUtils.areBasicStatsUptoDateForQueryAnswering(tbl, tbl.getParameters())) {
                   Logger.debug("Stats for table : " + tbl.getTableName() + " are not up to date.");
                   return null;
                 }
@@ -456,7 +457,7 @@ public class StatsOptimizer extends Transform {
                   Logger.debug("Table doesn't have up to date stats " + tbl.getTableName());
                   return null;
                 }
-                if (!StatsSetupConst.areColumnStatsUptoDate(tbl.getParameters(), colName)) {
+                if (!StatsUtils.areColumnStatsUptoDateForQueryAnswering(tbl, tbl.getParameters(), colName)) {
                   Logger.debug("Stats for table : " + tbl.getTableName() + " column " + colName
                       + " are not up to date.");
                   return null;
@@ -479,7 +480,7 @@ public class StatsOptimizer extends Transform {
                 Set<Partition> parts = pctx.getPrunedPartitions(tsOp.getConf().getAlias(), tsOp)
                     .getPartitions();
                 for (Partition part : parts) {
-                  if (!StatsSetupConst.areBasicStatsUptoDate(part.getParameters())) {
+                  if (!StatsUtils.areBasicStatsUptoDateForQueryAnswering(part.getTable(), part.getParameters())) {
                     Logger.debug("Stats for part : " + part.getSpec() + " are not up to date.");
                     return null;
                   }
@@ -517,7 +518,7 @@ public class StatsOptimizer extends Transform {
             String colName = colDesc.getColumn();
             StatType type = getType(colDesc.getTypeString());
             if(!tbl.isPartitioned()) {
-              if (!StatsSetupConst.areColumnStatsUptoDate(tbl.getParameters(), colName)) {
+              if (!StatsUtils.areColumnStatsUptoDateForQueryAnswering(tbl, tbl.getParameters(), colName)) {
                 Logger.debug("Stats for table : " + tbl.getTableName() + " column " + colName
                     + " are not up to date.");
                 return null;
@@ -658,7 +659,7 @@ public class StatsOptimizer extends Transform {
             String colName = colDesc.getColumn();
             StatType type = getType(colDesc.getTypeString());
             if (!tbl.isPartitioned()) {
-              if (!StatsSetupConst.areColumnStatsUptoDate(tbl.getParameters(), colName)) {
+              if (!StatsUtils.areColumnStatsUptoDateForQueryAnswering(tbl, tbl.getParameters(), colName)) {
                 Logger.debug("Stats for table : " + tbl.getTableName() + " column " + colName
                     + " are not up to date.");
                 return null;
@@ -889,7 +890,7 @@ public class StatsOptimizer extends Transform {
         Hive hive, Table tbl, String colName, Set<Partition> parts) throws TException {
       List<String> partNames = new ArrayList<String>(parts.size());
       for (Partition part : parts) {
-        if (!StatsSetupConst.areColumnStatsUptoDate(part.getParameters(), colName)) {
+        if (!StatsUtils.areColumnStatsUptoDateForQueryAnswering(part.getTable(), part.getParameters(), colName)) {
           Logger.debug("Stats for part : " + part.getSpec() + " column " + colName
               + " are not up to date.");
           return null;
@@ -911,7 +912,7 @@ public class StatsOptimizer extends Transform {
       if (tbl.isPartitioned()) {
         for (Partition part : pctx.getPrunedPartitions(
             tsOp.getConf().getAlias(), tsOp).getPartitions()) {
-          if (!StatsSetupConst.areBasicStatsUptoDate(part.getParameters())) {
+          if (!StatsUtils.areBasicStatsUptoDateForQueryAnswering(part.getTable(), part.getParameters())) {
             return null;
           }
           Long partRowCnt = Long.parseLong(part.getParameters().get(StatsSetupConst.ROW_COUNT));
@@ -922,7 +923,7 @@ public class StatsOptimizer extends Transform {
           rowCnt += partRowCnt;
         }
       } else { // unpartitioned table
-        if (!StatsSetupConst.areBasicStatsUptoDate(tbl.getParameters())) {
+        if (!StatsUtils.areBasicStatsUptoDateForQueryAnswering(tbl, tbl.getParameters())) {
           return null;
         }
         rowCnt = Long.parseLong(tbl.getProperty(StatsSetupConst.ROW_COUNT));

http://git-wip-us.apache.org/repos/asf/hive/blob/85ac5440/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsWithStatsRule.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsWithStatsRule.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsWithStatsRule.java
index 1edef98..085ad3e 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsWithStatsRule.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsWithStatsRule.java
@@ -296,8 +296,8 @@ public class HiveReduceExpressionsWithStatsRule extends RelOptRule {
         if (table != null) {
           ColStatistics colStats =
                   table.getColStat(Lists.newArrayList(columnOrigin.getOriginColumnOrdinal())).get(0);
-          if (colStats != null && StatsSetupConst.areColumnStatsUptoDate(
-                  table.getHiveTableMD().getParameters(), colStats.getColumnName())) {
+          if (colStats != null && StatsUtils.areColumnStatsUptoDateForQueryAnswering(
+                  table.getHiveTableMD(), table.getHiveTableMD().getParameters(), colStats.getColumnName())) {
             return colStats;
           }
         }
@@ -310,7 +310,8 @@ public class HiveReduceExpressionsWithStatsRule extends RelOptRule {
       if (columnOrigin != null) {
         RelOptHiveTable table = (RelOptHiveTable) columnOrigin.getOriginTable();
         if (table != null) {
-          if (StatsSetupConst.areBasicStatsUptoDate(table.getHiveTableMD().getParameters())) {
+          if (StatsUtils.areBasicStatsUptoDateForQueryAnswering(table.getHiveTableMD(),
+              table.getHiveTableMD().getParameters())) {
             return StatsUtils.getNumRows(table.getHiveTableMD());
           }
         }

http://git-wip-us.apache.org/repos/asf/hive/blob/85ac5440/ql/src/java/org/apache/hadoop/hive/ql/stats/StatsUtils.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/stats/StatsUtils.java b/ql/src/java/org/apache/hadoop/hive/ql/stats/StatsUtils.java
index 952b4ab..e000985 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/stats/StatsUtils.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/stats/StatsUtils.java
@@ -47,6 +47,7 @@ import org.apache.hadoop.hive.metastore.api.AggrStats;
 import org.apache.hadoop.hive.metastore.api.ColumnStatisticsData;
 import org.apache.hadoop.hive.metastore.api.ColumnStatisticsObj;
 import org.apache.hadoop.hive.metastore.api.Decimal;
+import org.apache.hadoop.hive.metastore.utils.MetaStoreUtils;
 import org.apache.hadoop.hive.ql.exec.ColumnInfo;
 import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
 import org.apache.hadoop.hive.ql.exec.RowSchema;
@@ -1996,4 +1997,28 @@ public class StatsUtils {
     }
     return null;
   }
+
+  /**
+   * Are the basic stats for the table up-to-date for query planning.
+   * Can run additional checks compared to the version in StatsSetupConst.
+   */
+  public static boolean areBasicStatsUptoDateForQueryAnswering(Table table, Map<String, String> params) {
+    // HIVE-19332: external tables should not be considered to have up-to-date stats.
+    if (MetaStoreUtils.isExternalTable(table.getTTable())) {
+      return false;
+    }
+    return StatsSetupConst.areBasicStatsUptoDate(params);
+  }
+
+  /**
+   * Are the column stats for the table up-to-date for query planning.
+   * Can run additional checks compared to the version in StatsSetupConst.
+   */
+  public static boolean areColumnStatsUptoDateForQueryAnswering(Table table, Map<String, String> params, String colName) {
+    // HIVE-19332: external tables should not be considered to have up-to-date stats.
+    if (MetaStoreUtils.isExternalTable(table.getTTable())) {
+      return false;
+    }
+    return StatsSetupConst.areColumnStatsUptoDate(params, colName);
+  }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/85ac5440/ql/src/test/queries/clientpositive/stats_only_external.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/stats_only_external.q b/ql/src/test/queries/clientpositive/stats_only_external.q
new file mode 100644
index 0000000..f379fc1
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/stats_only_external.q
@@ -0,0 +1,35 @@
+--! qt:dataset:src
+
+set hive.compute.query.using.stats=true;
+set hive.optimize.filter.stats.reduction=true;
+
+drop table if exists stats_only_external_tab1;
+drop table if exists stats_only_external_tab1_ext;
+
+create table stats_only_external_tab1 (key int, value string) stored as orc;
+create external table stats_only_external_tab1_ext like stats_only_external_tab1 stored as orc;
+
+insert into stats_only_external_tab1 select * from src;
+insert into stats_only_external_tab1_ext select * from src;
+
+analyze table stats_only_external_tab1 compute statistics for columns;
+analyze table stats_only_external_tab1_ext compute statistics for columns;
+
+set test.comment=Regular table should should compute using stats;
+set test.comment;
+explain select count(*) from stats_only_external_tab1;
+
+set test.comment=External table should not should compute using stats;
+set test.comment;
+explain select count(*) from stats_only_external_tab1_ext;
+
+set test.comment=Query predicates removed due to column stats;
+set test.comment;
+explain select count(*) from stats_only_external_tab1 where value is not null and key >= 0;
+
+set test.comment=Predicate removal disabled for external tables;
+set test.comment;
+explain select count(*) from stats_only_external_tab1_ext where value is not null and key >= 0;
+
+drop table stats_only_external_tab1;
+drop table stats_only_external_tab1_ext;

http://git-wip-us.apache.org/repos/asf/hive/blob/85ac5440/ql/src/test/results/clientpositive/llap/stats_only_external.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/llap/stats_only_external.q.out b/ql/src/test/results/clientpositive/llap/stats_only_external.q.out
new file mode 100644
index 0000000..554aa3e
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/stats_only_external.q.out
@@ -0,0 +1,227 @@
+PREHOOK: query: drop table if exists stats_only_external_tab1
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table if exists stats_only_external_tab1
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: drop table if exists stats_only_external_tab1_ext
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table if exists stats_only_external_tab1_ext
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: create table stats_only_external_tab1 (key int, value string) stored as orc
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stats_only_external_tab1
+POSTHOOK: query: create table stats_only_external_tab1 (key int, value string) stored as orc
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stats_only_external_tab1
+PREHOOK: query: create external table stats_only_external_tab1_ext like stats_only_external_tab1 stored as orc
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stats_only_external_tab1_ext
+POSTHOOK: query: create external table stats_only_external_tab1_ext like stats_only_external_tab1 stored as orc
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stats_only_external_tab1_ext
+PREHOOK: query: insert into stats_only_external_tab1 select * from src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@stats_only_external_tab1
+POSTHOOK: query: insert into stats_only_external_tab1 select * from src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@stats_only_external_tab1
+POSTHOOK: Lineage: stats_only_external_tab1.key EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: stats_only_external_tab1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: insert into stats_only_external_tab1_ext select * from src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@stats_only_external_tab1_ext
+POSTHOOK: query: insert into stats_only_external_tab1_ext select * from src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@stats_only_external_tab1_ext
+POSTHOOK: Lineage: stats_only_external_tab1_ext.key EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: stats_only_external_tab1_ext.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: analyze table stats_only_external_tab1 compute statistics for columns
+PREHOOK: type: ANALYZE_TABLE
+PREHOOK: Input: default@stats_only_external_tab1
+PREHOOK: Output: default@stats_only_external_tab1
+#### A masked pattern was here ####
+POSTHOOK: query: analyze table stats_only_external_tab1 compute statistics for columns
+POSTHOOK: type: ANALYZE_TABLE
+POSTHOOK: Input: default@stats_only_external_tab1
+POSTHOOK: Output: default@stats_only_external_tab1
+#### A masked pattern was here ####
+PREHOOK: query: analyze table stats_only_external_tab1_ext compute statistics for columns
+PREHOOK: type: ANALYZE_TABLE
+PREHOOK: Input: default@stats_only_external_tab1_ext
+PREHOOK: Output: default@stats_only_external_tab1_ext
+#### A masked pattern was here ####
+POSTHOOK: query: analyze table stats_only_external_tab1_ext compute statistics for columns
+POSTHOOK: type: ANALYZE_TABLE
+POSTHOOK: Input: default@stats_only_external_tab1_ext
+POSTHOOK: Output: default@stats_only_external_tab1_ext
+#### A masked pattern was here ####
+test.comment=Regular table should should compute using stats
+PREHOOK: query: explain select count(*) from stats_only_external_tab1
+PREHOOK: type: QUERY
+POSTHOOK: query: explain select count(*) from stats_only_external_tab1
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-0
+    Fetch Operator
+      limit: 1
+      Processor Tree:
+        ListSink
+
+test.comment=External table should not should compute using stats
+PREHOOK: query: explain select count(*) from stats_only_external_tab1_ext
+PREHOOK: type: QUERY
+POSTHOOK: query: explain select count(*) from stats_only_external_tab1_ext
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Tez
+#### A masked pattern was here ####
+      Edges:
+        Reducer 2 <- Map 1 (CUSTOM_SIMPLE_EDGE)
+#### A masked pattern was here ####
+      Vertices:
+        Map 1 
+            Map Operator Tree:
+                TableScan
+                  alias: stats_only_external_tab1_ext
+                  Statistics: Num rows: 500 Data size: 47000 Basic stats: COMPLETE Column stats: COMPLETE
+                  Select Operator
+                    Statistics: Num rows: 500 Data size: 47000 Basic stats: COMPLETE Column stats: COMPLETE
+                    Group By Operator
+                      aggregations: count()
+                      mode: hash
+                      outputColumnNames: _col0
+                      Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+                      Reduce Output Operator
+                        sort order: 
+                        Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+                        value expressions: _col0 (type: bigint)
+            Execution mode: vectorized, llap
+            LLAP IO: all inputs
+        Reducer 2 
+            Execution mode: vectorized, llap
+            Reduce Operator Tree:
+              Group By Operator
+                aggregations: count(VALUE._col0)
+                mode: mergepartial
+                outputColumnNames: _col0
+                Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+                File Output Operator
+                  compressed: false
+                  Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+                  table:
+                      input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                      output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                      serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+test.comment=Query predicates removed due to column stats
+PREHOOK: query: explain select count(*) from stats_only_external_tab1 where value is not null and key >= 0
+PREHOOK: type: QUERY
+POSTHOOK: query: explain select count(*) from stats_only_external_tab1 where value is not null and key >= 0
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-0
+    Fetch Operator
+      limit: 1
+      Processor Tree:
+        ListSink
+
+test.comment=Predicate removal disabled for external tables
+PREHOOK: query: explain select count(*) from stats_only_external_tab1_ext where value is not null and key >= 0
+PREHOOK: type: QUERY
+POSTHOOK: query: explain select count(*) from stats_only_external_tab1_ext where value is not null and key >= 0
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Tez
+#### A masked pattern was here ####
+      Edges:
+        Reducer 2 <- Map 1 (CUSTOM_SIMPLE_EDGE)
+#### A masked pattern was here ####
+      Vertices:
+        Map 1 
+            Map Operator Tree:
+                TableScan
+                  alias: stats_only_external_tab1_ext
+                  Statistics: Num rows: 500 Data size: 47500 Basic stats: COMPLETE Column stats: COMPLETE
+                  Filter Operator
+                    predicate: ((key >= 0) and value is not null) (type: boolean)
+                    Statistics: Num rows: 500 Data size: 47500 Basic stats: COMPLETE Column stats: COMPLETE
+                    Select Operator
+                      Statistics: Num rows: 500 Data size: 47500 Basic stats: COMPLETE Column stats: COMPLETE
+                      Group By Operator
+                        aggregations: count()
+                        mode: hash
+                        outputColumnNames: _col0
+                        Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+                        Reduce Output Operator
+                          sort order: 
+                          Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+                          value expressions: _col0 (type: bigint)
+            Execution mode: vectorized, llap
+            LLAP IO: all inputs
+        Reducer 2 
+            Execution mode: vectorized, llap
+            Reduce Operator Tree:
+              Group By Operator
+                aggregations: count(VALUE._col0)
+                mode: mergepartial
+                outputColumnNames: _col0
+                Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+                File Output Operator
+                  compressed: false
+                  Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+                  table:
+                      input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                      output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                      serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: drop table stats_only_external_tab1
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@stats_only_external_tab1
+PREHOOK: Output: default@stats_only_external_tab1
+POSTHOOK: query: drop table stats_only_external_tab1
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@stats_only_external_tab1
+POSTHOOK: Output: default@stats_only_external_tab1
+PREHOOK: query: drop table stats_only_external_tab1_ext
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@stats_only_external_tab1_ext
+PREHOOK: Output: default@stats_only_external_tab1_ext
+POSTHOOK: query: drop table stats_only_external_tab1_ext
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@stats_only_external_tab1_ext
+POSTHOOK: Output: default@stats_only_external_tab1_ext