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 bbf89ef..18252c4 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java @@ -53,6 +53,7 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FsShell; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hive.common.StatsSetupConst; import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.conf.HiveConf.ConfVars; @@ -4529,24 +4530,49 @@ private int exchangeTablePartition(Hive db, } private List getLocations(Hive db, Table table, Map partSpec) - throws HiveException { + throws HiveException, InvalidOperationException { List locations = new ArrayList(); if (partSpec == null) { if (table.isPartitioned()) { for (Partition partition : db.getPartitions(table)) { locations.add(partition.getDataLocation()); + if (needToUpdateStats(partition.getParameters())) { + db.alterPartition(table.getDbName(), table.getTableName(), partition); + } } } else { locations.add(table.getPath()); + if (needToUpdateStats(table.getParameters())) { + db.alterTable(table.getDbName()+"."+table.getTableName(), table); + } } } else { for (Partition partition : db.getPartitionsByNames(table, partSpec)) { locations.add(partition.getDataLocation()); + if (needToUpdateStats(partition.getParameters())) { + db.alterPartition(table.getDbName(), table.getTableName(), partition); + } } } return locations; } + private boolean needToUpdateStats(Map props) { + if (null == props) { + return false; + } + boolean statsPresent = false; + for (String stat : StatsSetupConst.supportedStats) { + String statVal = props.get(stat); + if (statVal != null && Long.parseLong(statVal) > 0) { + statsPresent = true; + props.put(statVal, "0"); + props.put(StatsSetupConst.COLUMN_STATS_ACCURATE, "false"); + } + } + return statsPresent; + } + private String escapeHiveCommand(String str) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length(); i ++) { diff --git ql/src/test/queries/clientpositive/truncate_table.q ql/src/test/queries/clientpositive/truncate_table.q index 769b10f..6a1ce7a 100644 --- ql/src/test/queries/clientpositive/truncate_table.q +++ ql/src/test/queries/clientpositive/truncate_table.q @@ -12,24 +12,31 @@ load data local inpath '../../data/files/kv1.txt' into table srcpart_truncate pa load data local inpath '../../data/files/kv1.txt' into table srcpart_truncate partition (ds='2008-04-09', hr='11'); load data local inpath '../../data/files/kv1.txt' into table srcpart_truncate partition (ds='2008-04-09', hr='12'); +analyze table src_truncate compute statistics; +analyze table srcpart_truncate partition(ds,hr) compute statistics; set hive.fetch.task.conversion=more; +set hive.compute.query.using.stats=true; -- truncate non-partitioned table explain TRUNCATE TABLE src_truncate; TRUNCATE TABLE src_truncate; select * from src_truncate; +select count (*) from src_truncate; -- truncate a partition explain TRUNCATE TABLE srcpart_truncate partition (ds='2008-04-08', hr='11'); TRUNCATE TABLE srcpart_truncate partition (ds='2008-04-08', hr='11'); select * from srcpart_truncate where ds='2008-04-08' and hr='11'; +select count(*) from srcpart_truncate where ds='2008-04-08' and hr='11'; -- truncate partitions with partial spec explain TRUNCATE TABLE srcpart_truncate partition (ds, hr='12'); TRUNCATE TABLE srcpart_truncate partition (ds, hr='12'); select * from srcpart_truncate where hr='12'; +select count(*) from srcpart_truncate where hr='12'; -- truncate partitioned table explain TRUNCATE TABLE srcpart_truncate; TRUNCATE TABLE srcpart_truncate; select * from srcpart_truncate; +select count(*) from srcpart_truncate; diff --git ql/src/test/results/clientpositive/truncate_table.q.out ql/src/test/results/clientpositive/truncate_table.q.out index 718895c..312a82f 100644 --- ql/src/test/results/clientpositive/truncate_table.q.out +++ ql/src/test/results/clientpositive/truncate_table.q.out @@ -80,6 +80,38 @@ POSTHOOK: query: load data local inpath '../../data/files/kv1.txt' into table sr POSTHOOK: type: LOAD #### A masked pattern was here #### POSTHOOK: Output: default@srcpart_truncate@ds=2008-04-09/hr=12 +PREHOOK: query: analyze table src_truncate compute statistics +PREHOOK: type: QUERY +PREHOOK: Input: default@src_truncate +PREHOOK: Output: default@src_truncate +POSTHOOK: query: analyze table src_truncate compute statistics +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src_truncate +POSTHOOK: Output: default@src_truncate +PREHOOK: query: analyze table srcpart_truncate partition(ds,hr) compute statistics +PREHOOK: type: QUERY +PREHOOK: Input: default@srcpart_truncate +PREHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=11 +PREHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=12 +PREHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=11 +PREHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=12 +PREHOOK: Output: default@srcpart_truncate +PREHOOK: Output: default@srcpart_truncate@ds=2008-04-08/hr=11 +PREHOOK: Output: default@srcpart_truncate@ds=2008-04-08/hr=12 +PREHOOK: Output: default@srcpart_truncate@ds=2008-04-09/hr=11 +PREHOOK: Output: default@srcpart_truncate@ds=2008-04-09/hr=12 +POSTHOOK: query: analyze table srcpart_truncate partition(ds,hr) compute statistics +POSTHOOK: type: QUERY +POSTHOOK: Input: default@srcpart_truncate +POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=11 +POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=12 +POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=11 +POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=12 +POSTHOOK: Output: default@srcpart_truncate +POSTHOOK: Output: default@srcpart_truncate@ds=2008-04-08/hr=11 +POSTHOOK: Output: default@srcpart_truncate@ds=2008-04-08/hr=12 +POSTHOOK: Output: default@srcpart_truncate@ds=2008-04-09/hr=11 +POSTHOOK: Output: default@srcpart_truncate@ds=2008-04-09/hr=12 PREHOOK: query: -- truncate non-partitioned table explain TRUNCATE TABLE src_truncate PREHOOK: type: TRUNCATETABLE @@ -109,6 +141,15 @@ POSTHOOK: query: select * from src_truncate POSTHOOK: type: QUERY POSTHOOK: Input: default@src_truncate #### A masked pattern was here #### +PREHOOK: query: select count (*) from src_truncate +PREHOOK: type: QUERY +PREHOOK: Input: default@src_truncate +#### A masked pattern was here #### +POSTHOOK: query: select count (*) from src_truncate +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src_truncate +#### A masked pattern was here #### +0 PREHOOK: query: -- truncate a partition explain TRUNCATE TABLE srcpart_truncate partition (ds='2008-04-08', hr='11') PREHOOK: type: TRUNCATETABLE @@ -143,6 +184,17 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@srcpart_truncate POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=11 #### A masked pattern was here #### +PREHOOK: query: select count(*) from srcpart_truncate where ds='2008-04-08' and hr='11' +PREHOOK: type: QUERY +PREHOOK: Input: default@srcpart_truncate +PREHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=11 +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from srcpart_truncate where ds='2008-04-08' and hr='11' +POSTHOOK: type: QUERY +POSTHOOK: Input: default@srcpart_truncate +POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=11 +#### A masked pattern was here #### +0 PREHOOK: query: -- truncate partitions with partial spec explain TRUNCATE TABLE srcpart_truncate partition (ds, hr='12') PREHOOK: type: TRUNCATETABLE @@ -181,6 +233,19 @@ POSTHOOK: Input: default@srcpart_truncate POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=12 POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=12 #### A masked pattern was here #### +PREHOOK: query: select count(*) from srcpart_truncate where hr='12' +PREHOOK: type: QUERY +PREHOOK: Input: default@srcpart_truncate +PREHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=12 +PREHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=12 +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from srcpart_truncate where hr='12' +POSTHOOK: type: QUERY +POSTHOOK: Input: default@srcpart_truncate +POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=12 +POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=12 +#### A masked pattern was here #### +0 PREHOOK: query: -- truncate partitioned table explain TRUNCATE TABLE srcpart_truncate PREHOOK: type: TRUNCATETABLE @@ -224,3 +289,20 @@ POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=12 POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=11 POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=12 #### A masked pattern was here #### +PREHOOK: query: select count(*) from srcpart_truncate +PREHOOK: type: QUERY +PREHOOK: Input: default@srcpart_truncate +PREHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=11 +PREHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=12 +PREHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=11 +PREHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=12 +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from srcpart_truncate +POSTHOOK: type: QUERY +POSTHOOK: Input: default@srcpart_truncate +POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=11 +POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-08/hr=12 +POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=11 +POSTHOOK: Input: default@srcpart_truncate@ds=2008-04-09/hr=12 +#### A masked pattern was here #### +0