diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/ColStatistics.java ql/src/java/org/apache/hadoop/hive/ql/plan/ColStatistics.java index 0749dc0..d1b7dea 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/ColStatistics.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/ColStatistics.java @@ -32,6 +32,7 @@ private double avgColLen; private long numTrues; private long numFalses; + private Range range; public ColStatistics(String tabAlias, String colName, String colType) { this.setTableAlias(tabAlias); @@ -118,6 +119,17 @@ public void setNumFalses(long numFalses) { this.numFalses = numFalses; } + public Range getRange() { + return range; + } + + public void setRange(Number minVal, Number maxVal) { + this.range = new Range(minVal, maxVal); + } + + public void setRange(Range r) { + this.range = r; + } @Override public String toString() { @@ -150,7 +162,24 @@ public ColStatistics clone() throws CloneNotSupportedException { clone.setNumNulls(numNulls); clone.setNumTrues(numTrues); clone.setNumFalses(numFalses); + if (range != null ) { + clone.setRange(range.clone()); + } return clone; } + public static class Range { + public final Number minValue; + public final Number maxValue; + Range(Number minValue, Number maxValue) { + super(); + this.minValue = minValue; + this.maxValue = maxValue; + } + @Override + public Range clone() { + return new Range(minValue, maxValue); + } + } + } diff --git ql/src/java/org/apache/hadoop/hive/ql/stats/StatsUtils.java ql/src/java/org/apache/hadoop/hive/ql/stats/StatsUtils.java index f664a7b..a375e28 100644 --- ql/src/java/org/apache/hadoop/hive/ql/stats/StatsUtils.java +++ ql/src/java/org/apache/hadoop/hive/ql/stats/StatsUtils.java @@ -25,10 +25,12 @@ import org.apache.hadoop.fs.FileSystem; 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.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.ql.exec.ColumnInfo; import org.apache.hadoop.hive.ql.exec.RowSchema; import org.apache.hadoop.hive.ql.exec.TableScanOperator; @@ -76,6 +78,8 @@ import org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableTimestampObjectInspector; import org.apache.hadoop.io.BytesWritable; +import java.math.BigDecimal; +import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -404,18 +408,22 @@ public static ColStatistics getColStatistics(ColumnStatisticsObj cso, String tab cs.setCountDistint(csd.getLongStats().getNumDVs()); cs.setNumNulls(csd.getLongStats().getNumNulls()); cs.setAvgColLen(JavaDataModel.get().primitive1()); + cs.setRange(csd.getLongStats().getLowValue(), csd.getLongStats().getHighValue()); } else if (colType.equalsIgnoreCase(serdeConstants.BIGINT_TYPE_NAME)) { cs.setCountDistint(csd.getLongStats().getNumDVs()); cs.setNumNulls(csd.getLongStats().getNumNulls()); cs.setAvgColLen(JavaDataModel.get().primitive2()); + cs.setRange(csd.getLongStats().getLowValue(), csd.getLongStats().getHighValue()); } else if (colType.equalsIgnoreCase(serdeConstants.FLOAT_TYPE_NAME)) { cs.setCountDistint(csd.getDoubleStats().getNumDVs()); cs.setNumNulls(csd.getDoubleStats().getNumNulls()); cs.setAvgColLen(JavaDataModel.get().primitive1()); + cs.setRange(csd.getDoubleStats().getLowValue(), csd.getDoubleStats().getHighValue()); } else if (colType.equalsIgnoreCase(serdeConstants.DOUBLE_TYPE_NAME)) { cs.setCountDistint(csd.getDoubleStats().getNumDVs()); cs.setNumNulls(csd.getDoubleStats().getNumNulls()); cs.setAvgColLen(JavaDataModel.get().primitive2()); + cs.setRange(csd.getDoubleStats().getLowValue(), csd.getDoubleStats().getHighValue()); } else if (colType.equalsIgnoreCase(serdeConstants.STRING_TYPE_NAME) || colType.startsWith(serdeConstants.CHAR_TYPE_NAME) || colType.startsWith(serdeConstants.VARCHAR_TYPE_NAME)) { @@ -441,6 +449,13 @@ public static ColStatistics getColStatistics(ColumnStatisticsObj cso, String tab cs.setAvgColLen(JavaDataModel.get().lengthOfDecimal()); cs.setCountDistint(csd.getDecimalStats().getNumDVs()); cs.setNumNulls(csd.getDecimalStats().getNumNulls()); + Decimal val = csd.getDecimalStats().getHighValue(); + BigDecimal maxVal = HiveDecimal. + create(new BigInteger(val.getUnscaled()), val.getScale()).bigDecimalValue(); + val = csd.getDecimalStats().getLowValue(); + BigDecimal minVal = HiveDecimal. + create(new BigInteger(val.getUnscaled()), val.getScale()).bigDecimalValue(); + cs.setRange(minVal, maxVal); } else if (colType.equalsIgnoreCase(serdeConstants.DATE_TYPE_NAME)) { cs.setAvgColLen(JavaDataModel.get().lengthOfDate()); } else {