Index: ql/src/test/results/clientpositive/columnstats_partlvl.q.out =================================================================== --- ql/src/test/results/clientpositive/columnstats_partlvl.q.out (revision 1608624) +++ ql/src/test/results/clientpositive/columnstats_partlvl.q.out (working copy) @@ -507,3 +507,72 @@ # col_name data_type min max num_nulls distinct_count avg_col_len max_col_len num_trues num_falses comment employeeName string 1 9 4.3076923076923075 6 from deserializer +PREHOOK: query: explain +analyze table Employee_Part compute statistics for columns +PREHOOK: type: QUERY +POSTHOOK: query: explain +analyze table Employee_Part compute statistics for columns +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + Stage-1 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Map Reduce + Map Operator Tree: + TableScan + alias: employee_part + Select Operator + expressions: employeeid (type: int), employeename (type: string) + outputColumnNames: employeeid, employeename + Group By Operator + aggregations: compute_stats(employeeid, 16), compute_stats(employeename, 16) + mode: hash + outputColumnNames: _col0, _col1 + Reduce Output Operator + sort order: + value expressions: _col0 (type: struct), _col1 (type: struct) + Reduce Operator Tree: + Group By Operator + aggregations: compute_stats(VALUE._col0), compute_stats(VALUE._col1) + mode: mergepartial + outputColumnNames: _col0, _col1 + Select Operator + expressions: _col0 (type: struct), _col1 (type: struct) + outputColumnNames: _col0, _col1 + File Output Operator + compressed: false + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-1 + Column Stats Work + Column Stats Desc: + Columns: employeeid, employeename + Column Types: int, string + Table: employee_part + +PREHOOK: query: analyze table Employee_Part compute statistics for columns +PREHOOK: type: QUERY +PREHOOK: Input: default@employee_part +PREHOOK: Input: default@employee_part@employeesalary=2000.0 +PREHOOK: Input: default@employee_part@employeesalary=4000.0 +#### A masked pattern was here #### +POSTHOOK: query: analyze table Employee_Part compute statistics for columns +POSTHOOK: type: QUERY +POSTHOOK: Input: default@employee_part +POSTHOOK: Input: default@employee_part@employeesalary=2000.0 +POSTHOOK: Input: default@employee_part@employeesalary=4000.0 +#### A masked pattern was here #### +PREHOOK: query: describe formatted Employee_Part.employeeID +PREHOOK: type: DESCTABLE +PREHOOK: Input: default@employee_part +POSTHOOK: query: describe formatted Employee_Part.employeeID +POSTHOOK: type: DESCTABLE +POSTHOOK: Input: default@employee_part +# col_name data_type min max num_nulls distinct_count avg_col_len max_col_len num_trues num_falses comment + +employeeID int 16 34 2 14 from deserializer Index: ql/src/test/queries/clientpositive/columnstats_partlvl.q =================================================================== --- ql/src/test/queries/clientpositive/columnstats_partlvl.q (revision 1608624) +++ ql/src/test/queries/clientpositive/columnstats_partlvl.q (working copy) @@ -25,3 +25,9 @@ describe formatted Employee_Part.employeeID partition (employeeSalary=2000.0); describe formatted Employee_Part.employeeName partition (employeeSalary=2000.0); + +explain +analyze table Employee_Part compute statistics for columns; +analyze table Employee_Part compute statistics for columns; + +describe formatted Employee_Part.employeeID; Index: ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java (revision 1608624) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java (working copy) @@ -300,8 +300,11 @@ rewrittenQueryBuilder.append(numBitVectors); rewrittenQueryBuilder.append(" )"); } - for (FieldSchema fs : tbl.getPartCols()) { - rewrittenQueryBuilder.append(" , " + fs.getName()); + + if (isPartitionStats) { + for (FieldSchema fs : tbl.getPartCols()) { + rewrittenQueryBuilder.append(" , " + fs.getName()); + } } rewrittenQueryBuilder.append(" from "); rewrittenQueryBuilder.append(tbl.getTableName()); Index: ql/src/java/org/apache/hadoop/hive/ql/exec/ColumnStatsTask.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/ColumnStatsTask.java (revision 1608624) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/ColumnStatsTask.java (working copy) @@ -287,7 +287,8 @@ Table tbl = db.getTable(dbName,tableName); List partColSchema = tbl.getPartCols(); // Partition columns are appended at end, we only care about stats column - for (int i = 0; i < fields.size() - partColSchema.size(); i++) { + int numOfStatCols = isTblLevel ? fields.size() : fields.size() - partColSchema.size(); + for (int i = 0; i < numOfStatCols; i++) { // Get the field objectInspector, fieldName and the field object. ObjectInspector foi = fields.get(i).getFieldObjectInspector(); Object f = (list == null ? null : list.get(i));