You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ai...@apache.org on 2016/05/20 13:28:04 UTC

hive git commit: HIVE-13616: Investigate renaming a table without invalidating the column stats (Reviewed by Chaoyu Tang, Ashutosh Chauhan)

Repository: hive
Updated Branches:
  refs/heads/master df722342a -> e5ba2690f


HIVE-13616: Investigate renaming a table without invalidating the column stats (Reviewed by Chaoyu Tang, Ashutosh Chauhan)


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

Branch: refs/heads/master
Commit: e5ba2690f1886952ee366de0310ea2aec031f347
Parents: df72234
Author: Aihua Xu <ai...@apache.org>
Authored: Wed May 11 15:11:20 2016 -0400
Committer: Aihua Xu <ai...@apache.org>
Committed: Fri May 20 09:26:25 2016 -0400

----------------------------------------------------------------------
 .../hadoop/hive/metastore/HiveAlterHandler.java |  85 ++++--
 .../rename_table_update_column_stats.q          |  55 ++++
 .../rename_table_update_column_stats.q.out      | 280 +++++++++++++++++++
 3 files changed, 390 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/e5ba2690/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java
----------------------------------------------------------------------
diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java
index 0652b9d..68c6e44 100644
--- a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java
+++ b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java
@@ -31,6 +31,7 @@ import org.apache.hadoop.hive.common.StatsSetupConst;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.metastore.api.AlreadyExistsException;
 import org.apache.hadoop.hive.metastore.api.ColumnStatistics;
+import org.apache.hadoop.hive.metastore.api.ColumnStatisticsDesc;
 import org.apache.hadoop.hive.metastore.api.ColumnStatisticsObj;
 import org.apache.hadoop.hive.metastore.api.Database;
 import org.apache.hadoop.hive.metastore.api.EnvironmentContext;
@@ -237,9 +238,8 @@ public class HiveAlterHandler implements AlterHandler {
           // alterPartition()
           MetaStoreUtils.updateTableStatsFast(db, newt, wh, false, true, environmentContext);
       }
-      updateTableColumnStatsForAlterTable(msdb, oldt, newt);
-      // now finally call alter table
-      msdb.alterTable(dbname, name, newt);
+
+      alterTableUpdateTableColumnStats(msdb, oldt, newt);
       // commit the changes
       success = msdb.commitTransaction();
     } catch (InvalidObjectException e) {
@@ -644,48 +644,73 @@ public class HiveAlterHandler implements AlterHandler {
     }
   }
 
-  private void updateTableColumnStatsForAlterTable(RawStore msdb, Table oldTable, Table newTable)
+  private void alterTableUpdateTableColumnStats(RawStore msdb,
+      Table oldTable, Table newTable)
       throws MetaException, InvalidObjectException {
-    String dbName = oldTable.getDbName();
-    String tableName = oldTable.getTableName();
-    String newDbName = HiveStringUtils.normalizeIdentifier(newTable.getDbName());
+    String dbName = oldTable.getDbName().toLowerCase();
+    String tableName = HiveStringUtils.normalizeIdentifier(oldTable.getTableName());
+    String newDbName = newTable.getDbName().toLowerCase();
     String newTableName = HiveStringUtils.normalizeIdentifier(newTable.getTableName());
 
     try {
-      if (!dbName.equals(newDbName) || !tableName.equals(newTableName)) {
-        msdb.deleteTableColumnStatistics(dbName, tableName, null);
-      } else {
-        List<FieldSchema> oldCols = oldTable.getSd().getCols();
-        List<FieldSchema> newCols = newTable.getSd().getCols();
-        if (!MetaStoreUtils.areSameColumns(oldCols, newCols)) {
+      List<FieldSchema> oldCols = oldTable.getSd().getCols();
+      List<FieldSchema> newCols = newTable.getSd().getCols();
+      List<ColumnStatisticsObj> newStatsObjs = new ArrayList<ColumnStatisticsObj>();
+      ColumnStatistics colStats = null;
+      boolean updateColumnStats = true;
+
+      // Nothing to update if everything is the same
+        if (newDbName.equals(dbName) &&
+            newTableName.equals(tableName) &&
+            MetaStoreUtils.areSameColumns(oldCols, newCols)) {
+          updateColumnStats = false;
+        }
+
+        if (updateColumnStats) {
           List<String> oldColNames = new ArrayList<String>(oldCols.size());
           for (FieldSchema oldCol : oldCols) {
             oldColNames.add(oldCol.getName());
           }
 
-          ColumnStatistics cs = msdb.getTableColumnStatistics(dbName, tableName, oldColNames);
-          if (cs == null) {
-            return;
-          }
+          // Collect column stats which need to be rewritten and remove old stats
+          colStats = msdb.getTableColumnStatistics(dbName, tableName, oldColNames);
+          if (colStats == null) {
+            updateColumnStats = false;
+          } else {
+            List<ColumnStatisticsObj> statsObjs = colStats.getStatsObj();
+            if (statsObjs != null) {
+              for (ColumnStatisticsObj statsObj : statsObjs) {
+                boolean found = false;
+                for (FieldSchema newCol : newCols) {
+                  if (statsObj.getColName().equalsIgnoreCase(newCol.getName())
+                      && statsObj.getColType().equals(newCol.getType())) {
+                    found = true;
+                    break;
+                  }
+                }
 
-          List<ColumnStatisticsObj> statsObjs = cs.getStatsObj();
-          if (statsObjs != null) {
-            for (ColumnStatisticsObj statsObj : statsObjs) {
-              boolean found = false;
-              for (FieldSchema newCol : newCols) {
-                if (statsObj.getColName().equalsIgnoreCase(newCol.getName())
-                    && statsObj.getColType().equals(newCol.getType())) {
-                  found = true;
-                  break;
+                if (found) {
+                  if (!newDbName.equals(dbName) || !newTableName.equals(tableName)) {
+                    msdb.deleteTableColumnStatistics(dbName, tableName, statsObj.getColName());
+                    newStatsObjs.add(statsObj);
+                  }
+                } else {
+                  msdb.deleteTableColumnStatistics(dbName, tableName, statsObj.getColName());
                 }
               }
-              if (!found) {
-                msdb.deleteTableColumnStatistics(dbName, tableName, statsObj.getColName());
-              }
             }
           }
         }
-      }
+
+        // Change to new table and append stats for the new table
+        msdb.alterTable(dbName, tableName, newTable);
+        if (updateColumnStats && !newStatsObjs.isEmpty()) {
+          ColumnStatisticsDesc statsDesc = colStats.getStatsDesc();
+          statsDesc.setDbName(newDbName);
+          statsDesc.setTableName(newTableName);
+          colStats.setStatsObj(newStatsObjs);
+          msdb.updateTableColumnStatistics(colStats);
+        }
     } catch (NoSuchObjectException nsoe) {
       LOG.debug("Could not find db entry." + nsoe);
     } catch (InvalidInputException e) {

http://git-wip-us.apache.org/repos/asf/hive/blob/e5ba2690/ql/src/test/queries/clientpositive/rename_table_update_column_stats.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/rename_table_update_column_stats.q b/ql/src/test/queries/clientpositive/rename_table_update_column_stats.q
new file mode 100644
index 0000000..8e5766c
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/rename_table_update_column_stats.q
@@ -0,0 +1,55 @@
+set hive.mapred.mode=nonstrict;
+set hive.metastore.try.direct.sql=true;
+
+drop database if exists statsdb1;
+create database statsdb1;
+drop database if exists statsdb2;
+create database statsdb2;
+
+create table statsdb1.testtable1 (col1 int, col2 string, col3 string);
+insert into statsdb1.testtable1 select key, value, 'val3' from src limit 10;
+
+use statsdb1;
+
+analyze table testtable1 compute statistics for columns;
+
+describe formatted statsdb1.testtable1 col1;
+describe formatted statsdb1.testtable1 col2;
+describe formatted statsdb1.testtable1 col3;
+
+alter table statsdb1.testtable1 rename to statsdb2.testtable2;
+describe formatted statsdb2.testtable2 col1;
+describe formatted statsdb2.testtable2 col2;
+describe formatted statsdb2.testtable2 col3;
+
+use default;
+drop database statsdb1 cascade;
+drop database statsdb2 cascade;
+
+
+set hive.metastore.try.direct.sql=false;
+
+drop database if exists statsdb1;
+create database statsdb1;
+drop database if exists statsdb2;
+create database statsdb2;
+
+create table statsdb1.testtable1 (col1 int, col2 string, col3 string);
+insert into statsdb1.testtable1 select key, value, 'val3' from src limit 10;
+
+use statsdb1;
+
+analyze table testtable1 compute statistics for columns;
+
+describe formatted statsdb1.testtable1 col1;
+describe formatted statsdb1.testtable1 col2;
+describe formatted statsdb1.testtable1 col3;
+
+alter table statsdb1.testtable1 rename to statsdb2.testtable2;
+describe formatted statsdb2.testtable2 col1;
+describe formatted statsdb2.testtable2 col2;
+describe formatted statsdb2.testtable2 col3;
+
+use default;
+drop database statsdb1 cascade;
+drop database statsdb2 cascade;

http://git-wip-us.apache.org/repos/asf/hive/blob/e5ba2690/ql/src/test/results/clientpositive/rename_table_update_column_stats.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/rename_table_update_column_stats.q.out b/ql/src/test/results/clientpositive/rename_table_update_column_stats.q.out
new file mode 100644
index 0000000..c025cfa
--- /dev/null
+++ b/ql/src/test/results/clientpositive/rename_table_update_column_stats.q.out
@@ -0,0 +1,280 @@
+PREHOOK: query: drop database if exists statsdb1
+PREHOOK: type: DROPDATABASE
+POSTHOOK: query: drop database if exists statsdb1
+POSTHOOK: type: DROPDATABASE
+PREHOOK: query: create database statsdb1
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:statsdb1
+POSTHOOK: query: create database statsdb1
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:statsdb1
+PREHOOK: query: drop database if exists statsdb2
+PREHOOK: type: DROPDATABASE
+POSTHOOK: query: drop database if exists statsdb2
+POSTHOOK: type: DROPDATABASE
+PREHOOK: query: create database statsdb2
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:statsdb2
+POSTHOOK: query: create database statsdb2
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:statsdb2
+PREHOOK: query: create table statsdb1.testtable1 (col1 int, col2 string, col3 string)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:statsdb1
+PREHOOK: Output: statsdb1@testtable1
+POSTHOOK: query: create table statsdb1.testtable1 (col1 int, col2 string, col3 string)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:statsdb1
+POSTHOOK: Output: statsdb1@testtable1
+PREHOOK: query: insert into statsdb1.testtable1 select key, value, 'val3' from src limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: statsdb1@testtable1
+POSTHOOK: query: insert into statsdb1.testtable1 select key, value, 'val3' from src limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: statsdb1@testtable1
+POSTHOOK: Lineage: testtable1.col1 EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: testtable1.col2 SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: testtable1.col3 SIMPLE []
+PREHOOK: query: use statsdb1
+PREHOOK: type: SWITCHDATABASE
+PREHOOK: Input: database:statsdb1
+POSTHOOK: query: use statsdb1
+POSTHOOK: type: SWITCHDATABASE
+POSTHOOK: Input: database:statsdb1
+PREHOOK: query: analyze table testtable1 compute statistics for columns
+PREHOOK: type: QUERY
+PREHOOK: Input: statsdb1@testtable1
+#### A masked pattern was here ####
+POSTHOOK: query: analyze table testtable1 compute statistics for columns
+POSTHOOK: type: QUERY
+POSTHOOK: Input: statsdb1@testtable1
+#### A masked pattern was here ####
+PREHOOK: query: describe formatted statsdb1.testtable1 col1
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: statsdb1@testtable1
+POSTHOOK: query: describe formatted statsdb1.testtable1 col1
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: statsdb1@testtable1
+# col_name            	data_type           	min                 	max                 	num_nulls           	distinct_count      	avg_col_len         	max_col_len         	num_trues           	num_falses          	comment             
+	 	 	 	 	 	 	 	 	 	 
+col1                	int                 	27                  	484                 	0                   	8                   	                    	                    	                    	                    	from deserializer   
+PREHOOK: query: describe formatted statsdb1.testtable1 col2
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: statsdb1@testtable1
+POSTHOOK: query: describe formatted statsdb1.testtable1 col2
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: statsdb1@testtable1
+# col_name            	data_type           	min                 	max                 	num_nulls           	distinct_count      	avg_col_len         	max_col_len         	num_trues           	num_falses          	comment             
+	 	 	 	 	 	 	 	 	 	 
+col2                	string              	                    	                    	0                   	12                  	6.7                 	7                   	                    	                    	from deserializer   
+PREHOOK: query: describe formatted statsdb1.testtable1 col3
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: statsdb1@testtable1
+POSTHOOK: query: describe formatted statsdb1.testtable1 col3
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: statsdb1@testtable1
+# col_name            	data_type           	min                 	max                 	num_nulls           	distinct_count      	avg_col_len         	max_col_len         	num_trues           	num_falses          	comment             
+	 	 	 	 	 	 	 	 	 	 
+col3                	string              	                    	                    	0                   	1                   	4.0                 	4                   	                    	                    	from deserializer   
+PREHOOK: query: alter table statsdb1.testtable1 rename to statsdb2.testtable2
+PREHOOK: type: ALTERTABLE_RENAME
+PREHOOK: Input: statsdb1@testtable1
+PREHOOK: Output: statsdb1@testtable1
+POSTHOOK: query: alter table statsdb1.testtable1 rename to statsdb2.testtable2
+POSTHOOK: type: ALTERTABLE_RENAME
+POSTHOOK: Input: statsdb1@testtable1
+POSTHOOK: Output: statsdb1@testtable1
+POSTHOOK: Output: statsdb2@testtable2
+PREHOOK: query: describe formatted statsdb2.testtable2 col1
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: statsdb2@testtable2
+POSTHOOK: query: describe formatted statsdb2.testtable2 col1
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: statsdb2@testtable2
+# col_name            	data_type           	min                 	max                 	num_nulls           	distinct_count      	avg_col_len         	max_col_len         	num_trues           	num_falses          	comment             
+	 	 	 	 	 	 	 	 	 	 
+col1                	int                 	27                  	484                 	0                   	8                   	                    	                    	                    	                    	from deserializer   
+PREHOOK: query: describe formatted statsdb2.testtable2 col2
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: statsdb2@testtable2
+POSTHOOK: query: describe formatted statsdb2.testtable2 col2
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: statsdb2@testtable2
+# col_name            	data_type           	min                 	max                 	num_nulls           	distinct_count      	avg_col_len         	max_col_len         	num_trues           	num_falses          	comment             
+	 	 	 	 	 	 	 	 	 	 
+col2                	string              	                    	                    	0                   	12                  	6.7                 	7                   	                    	                    	from deserializer   
+PREHOOK: query: describe formatted statsdb2.testtable2 col3
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: statsdb2@testtable2
+POSTHOOK: query: describe formatted statsdb2.testtable2 col3
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: statsdb2@testtable2
+# col_name            	data_type           	min                 	max                 	num_nulls           	distinct_count      	avg_col_len         	max_col_len         	num_trues           	num_falses          	comment             
+	 	 	 	 	 	 	 	 	 	 
+col3                	string              	                    	                    	0                   	1                   	4.0                 	4                   	                    	                    	from deserializer   
+PREHOOK: query: use default
+PREHOOK: type: SWITCHDATABASE
+PREHOOK: Input: database:default
+POSTHOOK: query: use default
+POSTHOOK: type: SWITCHDATABASE
+POSTHOOK: Input: database:default
+PREHOOK: query: drop database statsdb1 cascade
+PREHOOK: type: DROPDATABASE
+PREHOOK: Input: database:statsdb1
+PREHOOK: Output: database:statsdb1
+POSTHOOK: query: drop database statsdb1 cascade
+POSTHOOK: type: DROPDATABASE
+POSTHOOK: Input: database:statsdb1
+POSTHOOK: Output: database:statsdb1
+PREHOOK: query: drop database statsdb2 cascade
+PREHOOK: type: DROPDATABASE
+PREHOOK: Input: database:statsdb2
+PREHOOK: Output: database:statsdb2
+PREHOOK: Output: statsdb2@testtable2
+POSTHOOK: query: drop database statsdb2 cascade
+POSTHOOK: type: DROPDATABASE
+POSTHOOK: Input: database:statsdb2
+POSTHOOK: Output: database:statsdb2
+POSTHOOK: Output: statsdb2@testtable2
+PREHOOK: query: drop database if exists statsdb1
+PREHOOK: type: DROPDATABASE
+POSTHOOK: query: drop database if exists statsdb1
+POSTHOOK: type: DROPDATABASE
+PREHOOK: query: create database statsdb1
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:statsdb1
+POSTHOOK: query: create database statsdb1
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:statsdb1
+PREHOOK: query: drop database if exists statsdb2
+PREHOOK: type: DROPDATABASE
+POSTHOOK: query: drop database if exists statsdb2
+POSTHOOK: type: DROPDATABASE
+PREHOOK: query: create database statsdb2
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:statsdb2
+POSTHOOK: query: create database statsdb2
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:statsdb2
+PREHOOK: query: create table statsdb1.testtable1 (col1 int, col2 string, col3 string)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:statsdb1
+PREHOOK: Output: statsdb1@testtable1
+POSTHOOK: query: create table statsdb1.testtable1 (col1 int, col2 string, col3 string)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:statsdb1
+POSTHOOK: Output: statsdb1@testtable1
+PREHOOK: query: insert into statsdb1.testtable1 select key, value, 'val3' from src limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: statsdb1@testtable1
+POSTHOOK: query: insert into statsdb1.testtable1 select key, value, 'val3' from src limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: statsdb1@testtable1
+POSTHOOK: Lineage: testtable1.col1 EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: testtable1.col2 SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: testtable1.col3 SIMPLE []
+PREHOOK: query: use statsdb1
+PREHOOK: type: SWITCHDATABASE
+PREHOOK: Input: database:statsdb1
+POSTHOOK: query: use statsdb1
+POSTHOOK: type: SWITCHDATABASE
+POSTHOOK: Input: database:statsdb1
+PREHOOK: query: analyze table testtable1 compute statistics for columns
+PREHOOK: type: QUERY
+PREHOOK: Input: statsdb1@testtable1
+#### A masked pattern was here ####
+POSTHOOK: query: analyze table testtable1 compute statistics for columns
+POSTHOOK: type: QUERY
+POSTHOOK: Input: statsdb1@testtable1
+#### A masked pattern was here ####
+PREHOOK: query: describe formatted statsdb1.testtable1 col1
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: statsdb1@testtable1
+POSTHOOK: query: describe formatted statsdb1.testtable1 col1
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: statsdb1@testtable1
+# col_name            	data_type           	min                 	max                 	num_nulls           	distinct_count      	avg_col_len         	max_col_len         	num_trues           	num_falses          	comment             
+	 	 	 	 	 	 	 	 	 	 
+col1                	int                 	27                  	484                 	0                   	8                   	                    	                    	                    	                    	from deserializer   
+PREHOOK: query: describe formatted statsdb1.testtable1 col2
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: statsdb1@testtable1
+POSTHOOK: query: describe formatted statsdb1.testtable1 col2
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: statsdb1@testtable1
+# col_name            	data_type           	min                 	max                 	num_nulls           	distinct_count      	avg_col_len         	max_col_len         	num_trues           	num_falses          	comment             
+	 	 	 	 	 	 	 	 	 	 
+col2                	string              	                    	                    	0                   	12                  	6.7                 	7                   	                    	                    	from deserializer   
+PREHOOK: query: describe formatted statsdb1.testtable1 col3
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: statsdb1@testtable1
+POSTHOOK: query: describe formatted statsdb1.testtable1 col3
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: statsdb1@testtable1
+# col_name            	data_type           	min                 	max                 	num_nulls           	distinct_count      	avg_col_len         	max_col_len         	num_trues           	num_falses          	comment             
+	 	 	 	 	 	 	 	 	 	 
+col3                	string              	                    	                    	0                   	1                   	4.0                 	4                   	                    	                    	from deserializer   
+PREHOOK: query: alter table statsdb1.testtable1 rename to statsdb2.testtable2
+PREHOOK: type: ALTERTABLE_RENAME
+PREHOOK: Input: statsdb1@testtable1
+PREHOOK: Output: statsdb1@testtable1
+POSTHOOK: query: alter table statsdb1.testtable1 rename to statsdb2.testtable2
+POSTHOOK: type: ALTERTABLE_RENAME
+POSTHOOK: Input: statsdb1@testtable1
+POSTHOOK: Output: statsdb1@testtable1
+POSTHOOK: Output: statsdb2@testtable2
+PREHOOK: query: describe formatted statsdb2.testtable2 col1
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: statsdb2@testtable2
+POSTHOOK: query: describe formatted statsdb2.testtable2 col1
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: statsdb2@testtable2
+# col_name            	data_type           	min                 	max                 	num_nulls           	distinct_count      	avg_col_len         	max_col_len         	num_trues           	num_falses          	comment             
+	 	 	 	 	 	 	 	 	 	 
+col1                	int                 	27                  	484                 	0                   	8                   	                    	                    	                    	                    	from deserializer   
+PREHOOK: query: describe formatted statsdb2.testtable2 col2
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: statsdb2@testtable2
+POSTHOOK: query: describe formatted statsdb2.testtable2 col2
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: statsdb2@testtable2
+# col_name            	data_type           	min                 	max                 	num_nulls           	distinct_count      	avg_col_len         	max_col_len         	num_trues           	num_falses          	comment             
+	 	 	 	 	 	 	 	 	 	 
+col2                	string              	                    	                    	0                   	12                  	6.7                 	7                   	                    	                    	from deserializer   
+PREHOOK: query: describe formatted statsdb2.testtable2 col3
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: statsdb2@testtable2
+POSTHOOK: query: describe formatted statsdb2.testtable2 col3
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: statsdb2@testtable2
+# col_name            	data_type           	min                 	max                 	num_nulls           	distinct_count      	avg_col_len         	max_col_len         	num_trues           	num_falses          	comment             
+	 	 	 	 	 	 	 	 	 	 
+col3                	string              	                    	                    	0                   	1                   	4.0                 	4                   	                    	                    	from deserializer   
+PREHOOK: query: use default
+PREHOOK: type: SWITCHDATABASE
+PREHOOK: Input: database:default
+POSTHOOK: query: use default
+POSTHOOK: type: SWITCHDATABASE
+POSTHOOK: Input: database:default
+PREHOOK: query: drop database statsdb1 cascade
+PREHOOK: type: DROPDATABASE
+PREHOOK: Input: database:statsdb1
+PREHOOK: Output: database:statsdb1
+POSTHOOK: query: drop database statsdb1 cascade
+POSTHOOK: type: DROPDATABASE
+POSTHOOK: Input: database:statsdb1
+POSTHOOK: Output: database:statsdb1
+PREHOOK: query: drop database statsdb2 cascade
+PREHOOK: type: DROPDATABASE
+PREHOOK: Input: database:statsdb2
+PREHOOK: Output: database:statsdb2
+PREHOOK: Output: statsdb2@testtable2
+POSTHOOK: query: drop database statsdb2 cascade
+POSTHOOK: type: DROPDATABASE
+POSTHOOK: Input: database:statsdb2
+POSTHOOK: Output: database:statsdb2
+POSTHOOK: Output: statsdb2@testtable2