diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelWriterImpl.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelWriterImpl.java index 19429e60ee..d8c5713f6d 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelWriterImpl.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelWriterImpl.java @@ -17,13 +17,14 @@ */ package org.apache.hadoop.hive.ql.optimizer.calcite; -import java.lang.reflect.Field; import java.util.List; import java.util.Map; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.externalize.RelJsonWriter; import org.apache.calcite.rel.metadata.RelMetadataQuery; +import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.Pair; +import org.apache.hadoop.hive.ql.plan.ColStatistics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,6 +54,22 @@ protected void explain_(RelNode rel, List> values) { // This is a leaf, we will print the average row size and schema map.put("avgRowSize", mq.getAverageRowSize(rel)); map.put("rowType", relJson.toJson(rel.getRowType())); + // We also include column stats + RelOptHiveTable table = (RelOptHiveTable) rel.getTable(); + List colStats = table.getColStat( + ImmutableBitSet.range(0, table.getNoOfNonVirtualCols()).asList(), true); + final List list = jsonBuilder.list(); + for (ColStatistics cs : colStats) { + final Map csMap = jsonBuilder.map(); + csMap.put("name", cs.getColumnName()); + csMap.put("ndv", cs.getCountDistint()); + if (cs.getRange() != null) { + csMap.put("minValue", cs.getRange().minValue); + csMap.put("maxValue", cs.getRange().maxValue); + } + list.add(csMap); + } + map.put("colStats", list); } }