You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2013/04/10 02:38:54 UTC
svn commit: r1466305 [1/3] - in /hive/trunk:
common/src/java/org/apache/hadoop/hive/common/type/ data/files/
jdbc/src/java/org/apache/hadoop/hive/jdbc/
ql/src/java/org/apache/hadoop/hive/ql/udf/
ql/src/java/org/apache/hadoop/hive/ql/udf/generic/ ql/src...
Author: hashutosh
Date: Wed Apr 10 00:38:52 2013
New Revision: 1466305
URL: http://svn.apache.org/r1466305
Log:
HIVE-4271 : Limit precision of decimal type (Gunther Hagleitner via Ashutosh Chauhan)
Added:
hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/
hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveDecimal.java
hive/trunk/data/files/kv8.txt
hive/trunk/ql/src/test/queries/clientpositive/decimal_precision.q
hive/trunk/ql/src/test/results/clientpositive/decimal_precision.q.out
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/io/HiveDecimalWritable.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyHiveDecimal.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazy/objectinspector/primitive/LazyHiveDecimalObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/LazyBinaryHiveDecimal.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/HiveDecimalObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaHiveDecimalObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableHiveDecimalObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantHiveDecimalObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableHiveDecimalObjectInspector.java
Removed:
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/io/BigDecimalWritable.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyBigDecimal.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazy/objectinspector/primitive/LazyBigDecimalObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/LazyBinaryBigDecimal.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/BigDecimalObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaBigDecimalObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableBigDecimalObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableBigDecimalObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantBigDecimalObjectInspector.java
Modified:
hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveBaseResultSet.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAbs.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFBaseNumericOp.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFBaseNumericUnaryOp.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFCeil.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFFloor.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPDivide.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMinus.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMod.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMultiply.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPNegative.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPPlus.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPPositive.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFPosMod.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFPower.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRound.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToBoolean.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToByte.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToDouble.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToFloat.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToInteger.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToLong.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToShort.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToString.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFAverage.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFSum.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect2.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDecimal.java
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java
hive/trunk/ql/src/test/results/clientpositive/decimal_3.q.out
hive/trunk/ql/src/test/results/clientpositive/decimal_serde.q.out
hive/trunk/ql/src/test/results/clientpositive/decimal_udf.q.out
hive/trunk/ql/src/test/results/clientpositive/literal_decimal.q.out
hive/trunk/ql/src/test/results/clientpositive/serde_regex.q.out
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/RegexSerDe.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/SerDeUtils.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/BinarySortableSerDe.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/io/TimestampWritable.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyFactory.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyUtils.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazy/objectinspector/primitive/LazyPrimitiveObjectInspectorFactory.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/LazyBinaryFactory.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/LazyBinarySerDe.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorConverters.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java
hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/TestStatsSerde.java
hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/binarysortable/MyTestClass.java
hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/binarysortable/TestBinarySortableSerDe.java
hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/lazybinary/MyTestClassBigger.java
hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/lazybinary/MyTestClassSmaller.java
hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/lazybinary/TestLazyBinarySerDe.java
hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorConverters.java
hive/trunk/service/src/java/org/apache/hive/service/cli/ColumnValue.java
Added: hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveDecimal.java
URL: http://svn.apache.org/viewvc/hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveDecimal.java?rev=1466305&view=auto
==============================================================================
--- hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveDecimal.java (added)
+++ hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveDecimal.java Wed Apr 10 00:38:52 2013
@@ -0,0 +1,221 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.common.type;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.RoundingMode;
+
+/**
+ *
+ * HiveDecimal. Simple wrapper for BigDecimal. Adds fixed max precision and non scientific string
+ * representation
+ *
+ */
+public class HiveDecimal implements Comparable<HiveDecimal> {
+
+ public static final HiveDecimal ZERO = new HiveDecimal(BigDecimal.ZERO);
+
+ public static final int MAX_PRECISION = 36; // multiple of 9 for compact representation
+
+ public static final HiveDecimal ONE = new HiveDecimal(BigDecimal.ONE);
+
+ public static final int ROUND_FLOOR = BigDecimal.ROUND_FLOOR;
+
+ public static final int ROUND_CEILING = BigDecimal.ROUND_CEILING;
+
+ public static final int ROUND_HALF_UP = BigDecimal.ROUND_HALF_UP;
+
+ private BigDecimal bd = BigDecimal.ZERO;
+
+ public HiveDecimal(BigDecimal b) {
+ this(b, false);
+ }
+
+ public HiveDecimal(BigDecimal b, boolean allowRounding) {
+ bd = this.normalize(b, MAX_PRECISION, allowRounding);
+ if (bd == null) {
+ throw new NumberFormatException("Assignment would result in truncation");
+ }
+ }
+
+ public HiveDecimal(BigInteger unscaled, int scale) {
+ bd = this.normalize(new BigDecimal(unscaled, scale), MAX_PRECISION, false);
+ if (bd == null) {
+ throw new NumberFormatException("Assignment would result in truncation");
+ }
+ }
+
+ public HiveDecimal(String dec) {
+ bd = this.normalize(new BigDecimal(dec), MAX_PRECISION, false);
+ if (bd == null) {
+ throw new NumberFormatException("Assignment would result in truncation");
+ }
+ }
+
+ public HiveDecimal(BigInteger bi) {
+ bd = this.normalize(new BigDecimal(bi), MAX_PRECISION, false);
+ if (bd == null) {
+ throw new NumberFormatException("Assignment would result in truncation");
+ }
+ }
+
+ public HiveDecimal(int i) {
+ bd = new BigDecimal(i);
+ }
+
+ public HiveDecimal(long l) {
+ bd = new BigDecimal(l);
+ }
+
+ @Override
+ public String toString() {
+ return bd.toPlainString();
+ }
+
+ public HiveDecimal setScale(int i) {
+ return new HiveDecimal(bd.setScale(i));
+ }
+
+ @Override
+ public int compareTo(HiveDecimal dec) {
+ return bd.compareTo(dec.bd);
+ }
+
+ public int scale() {
+ return bd.scale();
+ }
+
+ public int precision() {
+ return bd.precision();
+ }
+
+ public int intValue() {
+ return bd.intValue();
+ }
+
+ public double doubleValue() {
+ return bd.doubleValue();
+ }
+
+ public long longValue() {
+ return bd.longValue();
+ }
+
+ public short shortValue() {
+ return bd.shortValue();
+ }
+
+ public float floatValue() {
+ return bd.floatValue();
+ }
+
+ public BigDecimal bigDecimalValue() {
+ return bd;
+ }
+
+ public byte byteValue() {
+ return bd.byteValue();
+ }
+
+ public HiveDecimal setScale(int adjustedScale, int rm) {
+ return new HiveDecimal(bd.setScale(adjustedScale, rm));
+ }
+
+ public HiveDecimal subtract(HiveDecimal dec) {
+ return new HiveDecimal(bd.subtract(dec.bd));
+ }
+
+ public HiveDecimal multiply(HiveDecimal dec) {
+ return new HiveDecimal(bd.multiply(dec.bd));
+ }
+
+ public BigInteger unscaledValue() {
+ return bd.unscaledValue();
+ }
+
+ public HiveDecimal scaleByPowerOfTen(int n) {
+ return new HiveDecimal(bd.scaleByPowerOfTen(n));
+ }
+
+ public HiveDecimal abs() {
+ return new HiveDecimal(bd.abs());
+ }
+
+ public HiveDecimal negate() {
+ return new HiveDecimal(bd.negate());
+ }
+
+ public HiveDecimal add(HiveDecimal dec) {
+ return new HiveDecimal(bd.add(dec.bd));
+ }
+
+ public HiveDecimal pow(int n) {
+ return new HiveDecimal(bd.pow(n));
+ }
+
+ public HiveDecimal remainder(HiveDecimal dec) {
+ return new HiveDecimal(bd.remainder(dec.bd));
+ }
+
+ public HiveDecimal divide(HiveDecimal dec) {
+ return new HiveDecimal(bd.divide(dec.bd, MAX_PRECISION, RoundingMode.HALF_UP), true);
+ }
+
+ private BigDecimal trim(BigDecimal d) {
+ if (d.compareTo(BigDecimal.ZERO) == 0) {
+ // Special case for 0, because java doesn't strip zeros correctly on that number.
+ d = BigDecimal.ZERO;
+ } else {
+ d = d.stripTrailingZeros();
+ if (d.scale() < 0) {
+ // no negative scale decimals
+ d = d.setScale(0);
+ }
+ }
+ return d;
+ }
+
+ private BigDecimal normalize(BigDecimal d, int precision, boolean allowRounding) {
+ if (d == null) {
+ return null;
+ }
+
+ d = trim(d);
+
+ // compute the number of digits of the decimal
+ int valuePrecision = d.precision()
+ + Math.max(0, 1 + d.scale() - d.precision());
+
+ if (valuePrecision > precision) {
+ if (allowRounding) {
+ // round "half up" until we hit the decimal point
+ int adjustedScale = d.scale() - (valuePrecision-precision);
+ if (adjustedScale >= 0) {
+ d = d.setScale(adjustedScale, RoundingMode.HALF_UP);
+ d = trim(d);
+ } else {
+ d = null;
+ }
+ } else {
+ d = null;
+ }
+ }
+ return d;
+ }
+}
Added: hive/trunk/data/files/kv8.txt
URL: http://svn.apache.org/viewvc/hive/trunk/data/files/kv8.txt?rev=1466305&view=auto
==============================================================================
--- hive/trunk/data/files/kv8.txt (added)
+++ hive/trunk/data/files/kv8.txt Wed Apr 10 00:38:52 2013
@@ -0,0 +1,73 @@
+1234567890123456789012345678901234567
+1.234567890123456789012345678901234567
+12.34567890123456789012345678901234567
+123.4567890123456789012345678901234567
+1234.567890123456789012345678901234567
+123456789012345678901234567890123456
+0.12345678901234567890123456789012345
+1.23456789012345678901234567890123456
+12.3456789012345678901234567890123456
+123.456789012345678901234567890123456
+1234.56789012345678901234567890123456
+12345.6789012345678901234567890123456
+123456.789012345678901234567890123456
+1234567.89012345678901234567890123456
+12345678.9012345678901234567890123456
+123456789.012345678901234567890123456
+1234567890.12345678901234567890123456
+12345678901.2345678901234567890123456
+123456789012.345678901234567890123456
+1234567890123.45678901234567890123456
+12345678901234.5678901234567890123456
+123456789012345.678901234567890123456
+1234567890123456.78901234567890123456
+12345678901234567.8901234567890123456
+123456789012345678.901234567890123456
+1234567890123456789.01234567890123456
+12345678901234567890.1234567890123456
+123456789012345678901.234567890123456
+1234567890123456789012.34567890123456
+12345678901234567890123.4567890123456
+123456789012345678901234.567890123456
+1234567890123456789012345.67890123456
+12345678901234567890123456.7890123456
+123456789012345678901234567.890123456
+1234567890123456789012345678.90123456
+12345678901234567890123456789.0123456
+123456789012345678901234567890.123456
+1234567890123456789012345678901.23456
+12345678901234567890123456789012.3456
+123456789012345678901234567890123.456
+1234567890123456789012345678901234.56
+12345678901234567890123456789012345.6
+123456789012345678901234567890123456.0
+123456789012345678901234567890123456.00
+123456789012345678901234567890123456.000
+000123456789012345678901234567890123456.000
+999999999999999999999999999999999999
+9999999999999999999999999999999999
+999999999999999999999999999999999
+-999999999999999999999999999999999999
+-9999999999999999999999999999999999
+-999999999999999999999999999999999
+0000000000000000000000000000000000000000000
+0.00000000000000000000000000000000001
+-0.00000000000000000000000000000000001
+0.000000000000000000000000000000000001
+-0.000000000000000000000000000000000001
+0.123456789012345
+1.234567890123456
+12.34567890123456
+123.4567890123456
+1234.567890123456
+12345.67890123456
+123456.7890123456
+1234567.890123456
+12345678.90123456
+123456789.0123456
+1234567890.123456
+12345678901.23456
+123456789012.3456
+1234567890123.456
+12345678901234.56
+123456789012345.6
Modified: hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveBaseResultSet.java
URL: http://svn.apache.org/viewvc/hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveBaseResultSet.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveBaseResultSet.java (original)
+++ hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveBaseResultSet.java Wed Apr 10 00:38:52 2013
@@ -42,6 +42,8 @@ import java.util.Calendar;
import java.util.List;
import java.util.Map;
+import org.apache.hadoop.hive.common.type.HiveDecimal;
+
/**
* Data independed base class which implements the common part of
* all hive resultsets.
@@ -110,8 +112,11 @@ public abstract class HiveBaseResultSet
if (obj instanceof BigDecimal) {
return ((BigDecimal) obj);
}
- throw new SQLException("Cannot convert column " + columnIndex
- + " to BigDecimal. Found data of type: "
+ if (obj instanceof HiveDecimal) {
+ return ((HiveDecimal) obj).bigDecimalValue();
+ }
+ throw new SQLException("Cannot convert column " + columnIndex
+ + " to BigDecimal. Found data of type: "
+ obj.getClass()+", value: " + obj.toString());
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAbs.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAbs.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAbs.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAbs.java Wed Apr 10 00:38:52 2013
@@ -20,7 +20,7 @@ package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
@@ -39,7 +39,7 @@ public class UDFAbs extends UDF {
private final DoubleWritable resultDouble = new DoubleWritable();
private final LongWritable resultLong = new LongWritable();
private final IntWritable resultInt = new IntWritable();
- private final BigDecimalWritable resultBigDecimal = new BigDecimalWritable();
+ private final HiveDecimalWritable resultHiveDecimal = new HiveDecimalWritable();
public DoubleWritable evaluate(DoubleWritable n) {
if (n == null) {
@@ -71,12 +71,12 @@ public class UDFAbs extends UDF {
return resultInt;
}
- public BigDecimalWritable evaluate(BigDecimalWritable n) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable n) {
if (n == null) {
return null;
}
- resultBigDecimal.set(n.getBigDecimal().abs());
- return resultBigDecimal;
+ resultHiveDecimal.set(n.getHiveDecimal().abs());
+ return resultHiveDecimal;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFBaseNumericOp.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFBaseNumericOp.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFBaseNumericOp.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFBaseNumericOp.java Wed Apr 10 00:38:52 2013
@@ -20,7 +20,7 @@ package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.NumericOpMethodResolver;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -49,7 +49,7 @@ public abstract class UDFBaseNumericOp e
protected LongWritable longWritable = new LongWritable();
protected FloatWritable floatWritable = new FloatWritable();
protected DoubleWritable doubleWritable = new DoubleWritable();
- protected BigDecimalWritable bigDecimalWritable = new BigDecimalWritable();
+ protected HiveDecimalWritable decimalWritable = new HiveDecimalWritable();
public abstract ByteWritable evaluate(ByteWritable a, ByteWritable b);
@@ -63,5 +63,5 @@ public abstract class UDFBaseNumericOp e
public abstract DoubleWritable evaluate(DoubleWritable a, DoubleWritable b);
- public abstract BigDecimalWritable evaluate(BigDecimalWritable a, BigDecimalWritable b);
+ public abstract HiveDecimalWritable evaluate(HiveDecimalWritable a, HiveDecimalWritable b);
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFBaseNumericUnaryOp.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFBaseNumericUnaryOp.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFBaseNumericUnaryOp.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFBaseNumericUnaryOp.java Wed Apr 10 00:38:52 2013
@@ -19,7 +19,7 @@
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -46,7 +46,7 @@ public abstract class UDFBaseNumericUnar
protected LongWritable longWritable = new LongWritable();
protected FloatWritable floatWritable = new FloatWritable();
protected DoubleWritable doubleWritable = new DoubleWritable();
- protected BigDecimalWritable bigDecimalWritable = new BigDecimalWritable();
+ protected HiveDecimalWritable decimalWritable = new HiveDecimalWritable();
public abstract ByteWritable evaluate(ByteWritable a);
@@ -60,5 +60,5 @@ public abstract class UDFBaseNumericUnar
public abstract DoubleWritable evaluate(DoubleWritable a);
- public abstract BigDecimalWritable evaluate(BigDecimalWritable a);
+ public abstract HiveDecimalWritable evaluate(HiveDecimalWritable a);
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFCeil.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFCeil.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFCeil.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFCeil.java Wed Apr 10 00:38:52 2013
@@ -18,14 +18,11 @@
package org.apache.hadoop.hive.ql.udf;
-import java.math.BigDecimal;
-import java.math.MathContext;
-import java.math.RoundingMode;
-
+import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.io.LongWritable;
/**
@@ -40,7 +37,7 @@ import org.apache.hadoop.io.LongWritable
+ " > SELECT _FUNC_(5) FROM src LIMIT 1;\n" + " 5")
public class UDFCeil extends UDF {
private final LongWritable longWritable = new LongWritable();
- private final BigDecimalWritable bigDecimalWritable = new BigDecimalWritable();
+ private final HiveDecimalWritable decimalWritable = new HiveDecimalWritable();
public UDFCeil() {
}
@@ -54,14 +51,14 @@ public class UDFCeil extends UDF {
}
}
- public BigDecimalWritable evaluate(BigDecimalWritable i) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable i) {
if (i == null) {
return null;
} else {
- BigDecimal bd = i.getBigDecimal();
+ HiveDecimal bd = i.getHiveDecimal();
int origScale = bd.scale();
- bigDecimalWritable.set(bd.setScale(0, BigDecimal.ROUND_CEILING).setScale(origScale));
- return bigDecimalWritable;
+ decimalWritable.set(bd.setScale(0, HiveDecimal.ROUND_CEILING).setScale(origScale));
+ return decimalWritable;
}
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFFloor.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFFloor.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFFloor.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFFloor.java Wed Apr 10 00:38:52 2013
@@ -18,14 +18,11 @@
package org.apache.hadoop.hive.ql.udf;
-import java.math.BigDecimal;
-import java.math.MathContext;
-import java.math.RoundingMode;
-
+import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.io.LongWritable;
/**
@@ -40,7 +37,7 @@ import org.apache.hadoop.io.LongWritable
+ " > SELECT _FUNC_(5) FROM src LIMIT 1;\n" + " 5")
public class UDFFloor extends UDF {
private final LongWritable result = new LongWritable();
- private final BigDecimalWritable bdResult = new BigDecimalWritable();
+ private final HiveDecimalWritable bdResult = new HiveDecimalWritable();
public UDFFloor() {
}
@@ -54,13 +51,13 @@ public class UDFFloor extends UDF {
}
}
- public BigDecimalWritable evaluate(BigDecimalWritable i) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable i) {
if (i == null) {
return null;
} else {
- BigDecimal bd = i.getBigDecimal();
+ HiveDecimal bd = i.getHiveDecimal();
int origScale = bd.scale();
- bdResult.set(bd.setScale(0, BigDecimal.ROUND_FLOOR).setScale(origScale));
+ bdResult.set(bd.setScale(0, HiveDecimal.ROUND_FLOOR).setScale(origScale));
return bdResult;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPDivide.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPDivide.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPDivide.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPDivide.java Wed Apr 10 00:38:52 2013
@@ -18,13 +18,11 @@
package org.apache.hadoop.hive.ql.udf;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-
+import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
/**
* UDFOPDivide.
@@ -38,10 +36,9 @@ import org.apache.hadoop.hive.serde2.io.
* return a double for divide.
*/
public class UDFOPDivide extends UDF {
- private final DoubleWritable doubleWritable = new DoubleWritable();
- private final BigDecimalWritable bigDecimalWritable = new BigDecimalWritable();
- public static final int MAX_SCALE = 65; // max compatible with MySQL
+ private final DoubleWritable doubleWritable = new DoubleWritable();
+ private final HiveDecimalWritable decimalWritable = new HiveDecimalWritable();
public DoubleWritable evaluate(DoubleWritable a, DoubleWritable b) {
// LOG.info("Get input " + a.getClass() + ":" + a + " " + b.getClass() + ":"
@@ -54,17 +51,17 @@ public class UDFOPDivide extends UDF {
return doubleWritable;
}
- public BigDecimalWritable evaluate(BigDecimalWritable a, BigDecimalWritable b) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable a, HiveDecimalWritable b) {
if ((a == null) || (b == null)) {
return null;
}
- if (b.getBigDecimal().compareTo(BigDecimal.ZERO) == 0) {
+ if (b.getHiveDecimal().compareTo(HiveDecimal.ZERO) == 0) {
return null;
} else {
- bigDecimalWritable.set(a.getBigDecimal().divide(
- b.getBigDecimal(), MAX_SCALE, RoundingMode.HALF_UP));
+ decimalWritable.set(a.getHiveDecimal().divide(
+ b.getHiveDecimal()));
}
- return bigDecimalWritable;
+ return decimalWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMinus.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMinus.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMinus.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMinus.java Wed Apr 10 00:38:52 2013
@@ -19,9 +19,9 @@
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.IntWritable;
@@ -110,13 +110,18 @@ public class UDFOPMinus extends UDFBaseN
}
@Override
- public BigDecimalWritable evaluate(BigDecimalWritable a, BigDecimalWritable b) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable a, HiveDecimalWritable b) {
if ((a == null) || (b == null)) {
return null;
}
- bigDecimalWritable.set(a.getBigDecimal().subtract(b.getBigDecimal()));
- return bigDecimalWritable;
+ try {
+ decimalWritable.set(a.getHiveDecimal().subtract(b.getHiveDecimal()));
+ } catch (NumberFormatException e) {
+ return null;
+ }
+
+ return decimalWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMod.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMod.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMod.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMod.java Wed Apr 10 00:38:52 2013
@@ -18,12 +18,11 @@
package org.apache.hadoop.hive.ql.udf;
-import java.math.BigDecimal;
-
+import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.IntWritable;
@@ -112,19 +111,24 @@ public class UDFOPMod extends UDFBaseNum
}
@Override
- public BigDecimalWritable evaluate(BigDecimalWritable a, BigDecimalWritable b) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable a, HiveDecimalWritable b) {
if ((a == null) || (b == null)) {
return null;
}
- BigDecimal av = a.getBigDecimal();
- BigDecimal bv = b.getBigDecimal();
+ HiveDecimal av = a.getHiveDecimal();
+ HiveDecimal bv = b.getHiveDecimal();
+
+ if (bv.compareTo(HiveDecimal.ZERO) == 0) {
+ return null;
+ }
- if (bv.compareTo(BigDecimal.ZERO) == 0) {
+ try {
+ decimalWritable.set(av.remainder(bv));
+ } catch(NumberFormatException e) {
return null;
}
- bigDecimalWritable.set(av.remainder(bv));
- return bigDecimalWritable;
+ return decimalWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMultiply.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMultiply.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMultiply.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPMultiply.java Wed Apr 10 00:38:52 2013
@@ -19,9 +19,9 @@
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.IntWritable;
@@ -110,12 +110,17 @@ public class UDFOPMultiply extends UDFBa
}
@Override
- public BigDecimalWritable evaluate(BigDecimalWritable a, BigDecimalWritable b) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable a, HiveDecimalWritable b) {
if ((a == null) || (b == null)) {
return null;
}
- bigDecimalWritable.set(a.getBigDecimal().multiply(b.getBigDecimal()));
- return bigDecimalWritable;
+ try {
+ decimalWritable.set(a.getHiveDecimal().multiply(b.getHiveDecimal()));
+ } catch (NumberFormatException e) {
+ return null;
+ }
+
+ return decimalWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPNegative.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPNegative.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPNegative.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPNegative.java Wed Apr 10 00:38:52 2013
@@ -19,7 +19,7 @@
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -92,12 +92,12 @@ public class UDFOPNegative extends UDFBa
}
@Override
- public BigDecimalWritable evaluate(BigDecimalWritable a) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable a) {
if (a == null) {
return null;
}
- bigDecimalWritable.set(a.getBigDecimal().negate());
- return bigDecimalWritable;
+ decimalWritable.set(a.getHiveDecimal().negate());
+ return decimalWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPPlus.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPPlus.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPPlus.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPPlus.java Wed Apr 10 00:38:52 2013
@@ -19,9 +19,9 @@
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.IntWritable;
@@ -115,13 +115,17 @@ public class UDFOPPlus extends UDFBaseNu
}
@Override
- public BigDecimalWritable evaluate(BigDecimalWritable a, BigDecimalWritable b) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable a, HiveDecimalWritable b) {
if ((a == null) || (b == null)) {
return null;
}
- bigDecimalWritable.set(a.getBigDecimal().add(b.getBigDecimal()));
- return bigDecimalWritable;
+ try {
+ decimalWritable.set(a.getHiveDecimal().add(b.getHiveDecimal()));
+ } catch(NumberFormatException e) {
+ return null;
+ }
+ return decimalWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPPositive.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPPositive.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPPositive.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPPositive.java Wed Apr 10 00:38:52 2013
@@ -19,7 +19,7 @@
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -68,7 +68,7 @@ public class UDFOPPositive extends UDFBa
}
@Override
- public BigDecimalWritable evaluate(BigDecimalWritable a) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable a) {
return a;
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFPosMod.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFPosMod.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFPosMod.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFPosMod.java Wed Apr 10 00:38:52 2013
@@ -18,12 +18,11 @@
package org.apache.hadoop.hive.ql.udf;
-import java.math.BigDecimal;
-
+import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.IntWritable;
@@ -113,19 +112,24 @@ public class UDFPosMod extends UDFBaseNu
}
@Override
- public BigDecimalWritable evaluate(BigDecimalWritable a, BigDecimalWritable b) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable a, HiveDecimalWritable b) {
if ((a == null) || (b == null)) {
return null;
}
- BigDecimal av = a.getBigDecimal();
- BigDecimal bv = b.getBigDecimal();
+ HiveDecimal av = a.getHiveDecimal();
+ HiveDecimal bv = b.getHiveDecimal();
+
+ if (bv.compareTo(HiveDecimal.ZERO) == 0) {
+ return null;
+ }
- if (bv.compareTo(BigDecimal.ZERO) == 0) {
+ try {
+ decimalWritable.set(av.remainder(bv).add(bv).remainder(bv));
+ } catch (NumberFormatException e) {
return null;
}
- bigDecimalWritable.set(av.remainder(bv).add(bv).remainder(bv));
- return bigDecimalWritable;
+ return decimalWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFPower.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFPower.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFPower.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFPower.java Wed Apr 10 00:38:52 2013
@@ -20,8 +20,8 @@ package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.io.IntWritable;
/**
@@ -34,7 +34,7 @@ import org.apache.hadoop.io.IntWritable;
+ " > SELECT _FUNC_(2, 3) FROM src LIMIT 1;\n" + " 8")
public class UDFPower extends UDF {
private final DoubleWritable resultDouble = new DoubleWritable();
- private final BigDecimalWritable resultBigDecimal = new BigDecimalWritable();
+ private final HiveDecimalWritable resultHiveDecimal = new HiveDecimalWritable();
public UDFPower() {
}
@@ -50,7 +50,7 @@ public class UDFPower extends UDF {
return resultDouble;
}
}
-
+
/**
* Raise a to the power of b.
*/
@@ -62,16 +62,20 @@ public class UDFPower extends UDF {
return resultDouble;
}
}
-
+
/**
* Raise a to the power of b
*/
- public BigDecimalWritable evaluate(BigDecimalWritable a, IntWritable b) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable a, IntWritable b) {
if (a == null || b == null) {
return null;
} else {
- resultBigDecimal.set(a.getBigDecimal().pow(b.get()));
- return resultBigDecimal;
+ try {
+ resultHiveDecimal.set(a.getHiveDecimal().pow(b.get()));
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ return resultHiveDecimal;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRound.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRound.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRound.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRound.java Wed Apr 10 00:38:52 2013
@@ -21,11 +21,12 @@ package org.apache.hadoop.hive.ql.udf;
import java.math.BigDecimal;
import java.math.RoundingMode;
+import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
@@ -39,7 +40,7 @@ import org.apache.hadoop.io.LongWritable
extended = "Example:\n"
+ " > SELECT _FUNC_(12.3456, 1) FROM src LIMIT 1;\n" + " 12.3'")
public class UDFRound extends UDF {
- private final BigDecimalWritable bigDecimalWritable = new BigDecimalWritable();
+ private final HiveDecimalWritable decimalWritable = new HiveDecimalWritable();
private final DoubleWritable doubleWritable = new DoubleWritable();
private final LongWritable longWritable = new LongWritable();
private final IntWritable intWritable = new IntWritable();
@@ -74,21 +75,25 @@ public class UDFRound extends UDF {
return evaluate(n, i.get());
}
- private BigDecimalWritable evaluate(BigDecimalWritable n, int i) {
+ private HiveDecimalWritable evaluate(HiveDecimalWritable n, int i) {
if (n == null) {
return null;
}
- BigDecimal bd = n.getBigDecimal();
- bd = n.getBigDecimal().setScale(i, RoundingMode.HALF_UP);
- bigDecimalWritable.set(bd);
- return bigDecimalWritable;
+ HiveDecimal bd = n.getHiveDecimal();
+ try {
+ bd = n.getHiveDecimal().setScale(i, HiveDecimal.ROUND_HALF_UP);
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ decimalWritable.set(bd);
+ return decimalWritable;
}
- public BigDecimalWritable evaluate(BigDecimalWritable n) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable n) {
return evaluate(n, 0);
}
- public BigDecimalWritable evaluate(BigDecimalWritable n, IntWritable i) {
+ public HiveDecimalWritable evaluate(HiveDecimalWritable n, IntWritable i) {
if (i == null) {
return null;
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToBoolean.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToBoolean.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToBoolean.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToBoolean.java Wed Apr 10 00:38:52 2013
@@ -18,10 +18,10 @@
package org.apache.hadoop.hive.ql.udf;
-import java.math.BigDecimal;
+import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -175,11 +175,11 @@ public class UDFToBoolean extends UDF {
}
}
- public BooleanWritable evaluate(BigDecimalWritable i) {
+ public BooleanWritable evaluate(HiveDecimalWritable i) {
if (i == null) {
return null;
} else {
- booleanWritable.set(BigDecimal.ZERO.compareTo(i.getBigDecimal()) != 0);
+ booleanWritable.set(HiveDecimal.ZERO.compareTo(i.getHiveDecimal()) != 0);
return booleanWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToByte.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToByte.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToByte.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToByte.java Wed Apr 10 00:38:52 2013
@@ -19,7 +19,7 @@
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -182,11 +182,11 @@ public class UDFToByte extends UDF {
}
}
- public ByteWritable evaluate(BigDecimalWritable i) {
+ public ByteWritable evaluate(HiveDecimalWritable i) {
if (i == null) {
return null;
} else {
- byteWritable.set(i.getBigDecimal().byteValue());
+ byteWritable.set(i.getHiveDecimal().byteValue());
return byteWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToDouble.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToDouble.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToDouble.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToDouble.java Wed Apr 10 00:38:52 2013
@@ -19,7 +19,7 @@
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -184,11 +184,11 @@ public class UDFToDouble extends UDF {
}
}
- public DoubleWritable evaluate(BigDecimalWritable i) {
+ public DoubleWritable evaluate(HiveDecimalWritable i) {
if (i == null) {
return null;
} else {
- doubleWritable.set(i.getBigDecimal().doubleValue());
+ doubleWritable.set(i.getHiveDecimal().doubleValue());
return doubleWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToFloat.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToFloat.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToFloat.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToFloat.java Wed Apr 10 00:38:52 2013
@@ -19,7 +19,7 @@
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -185,11 +185,11 @@ public class UDFToFloat extends UDF {
}
}
- public FloatWritable evaluate(BigDecimalWritable i) {
+ public FloatWritable evaluate(HiveDecimalWritable i) {
if (i == null) {
return null;
} else {
- floatWritable.set(i.getBigDecimal().floatValue());
+ floatWritable.set(i.getHiveDecimal().floatValue());
return floatWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToInteger.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToInteger.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToInteger.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToInteger.java Wed Apr 10 00:38:52 2013
@@ -19,7 +19,7 @@
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -189,11 +189,11 @@ public class UDFToInteger extends UDF {
}
}
- public IntWritable evaluate(BigDecimalWritable i) {
+ public IntWritable evaluate(HiveDecimalWritable i) {
if (i == null) {
return null;
} else {
- intWritable.set(i.getBigDecimal().intValue());
+ intWritable.set(i.getHiveDecimal().intValue());
return intWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToLong.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToLong.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToLong.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToLong.java Wed Apr 10 00:38:52 2013
@@ -19,7 +19,7 @@
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -193,11 +193,11 @@ public class UDFToLong extends UDF {
}
}
- public LongWritable evaluate(BigDecimalWritable i) {
+ public LongWritable evaluate(HiveDecimalWritable i) {
if (i == null) {
return null;
} else {
- longWritable.set(i.getBigDecimal().longValue());
+ longWritable.set(i.getHiveDecimal().longValue());
return longWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToShort.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToShort.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToShort.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToShort.java Wed Apr 10 00:38:52 2013
@@ -19,7 +19,7 @@
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -182,11 +182,11 @@ public class UDFToShort extends UDF {
}
}
- public ShortWritable evaluate(BigDecimalWritable i) {
+ public ShortWritable evaluate(HiveDecimalWritable i) {
if (i == null) {
return null;
} else {
- shortWritable.set(i.getBigDecimal().shortValue());
+ shortWritable.set(i.getHiveDecimal().shortValue());
return shortWritable;
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToString.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToString.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToString.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToString.java Wed Apr 10 00:38:52 2013
@@ -20,7 +20,7 @@ package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.serde2.ByteStream;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -142,7 +142,7 @@ public class UDFToString extends UDF {
}
}
- public Text evaluate(BigDecimalWritable i) {
+ public Text evaluate(HiveDecimalWritable i) {
if (i == null) {
return null;
} else {
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFAverage.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFAverage.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFAverage.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFAverage.java Wed Apr 10 00:38:52 2013
@@ -17,27 +17,25 @@
*/
package org.apache.hadoop.hive.ql.udf.generic;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
import java.util.ArrayList;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.parse.SemanticException;
-import org.apache.hadoop.hive.ql.udf.UDFOPDivide;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator.AggregationBuffer;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StructField;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
-import org.apache.hadoop.hive.serde2.objectinspector.primitive.BigDecimalObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.DoubleObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.HiveDecimalObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.LongObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
@@ -150,63 +148,85 @@ public class GenericUDAFAverage extends
}
}
- public static class GenericUDAFAverageEvaluatorDecimal extends AbstractGenericUDAFAverageEvaluator<BigDecimal> {
+ public static class GenericUDAFAverageEvaluatorDecimal extends AbstractGenericUDAFAverageEvaluator<HiveDecimal> {
@Override
- public void doReset(AverageAggregationBuffer<BigDecimal> aggregation) throws HiveException {
+ public void doReset(AverageAggregationBuffer<HiveDecimal> aggregation) throws HiveException {
aggregation.count = 0;
- aggregation.sum = BigDecimal.ZERO;
+ aggregation.sum = HiveDecimal.ZERO;
}
@Override
protected ObjectInspector getSumFieldJavaObjectInspector() {
- return PrimitiveObjectInspectorFactory.javaBigDecimalObjectInspector;
+ return PrimitiveObjectInspectorFactory.javaHiveDecimalObjectInspector;
}
@Override
protected ObjectInspector getSumFieldWritableObjectInspector() {
- return PrimitiveObjectInspectorFactory.writableBigDecimalObjectInspector;
+ return PrimitiveObjectInspectorFactory.writableHiveDecimalObjectInspector;
}
@Override
- protected void doIterate(AverageAggregationBuffer<BigDecimal> aggregation,
+ protected void doIterate(AverageAggregationBuffer<HiveDecimal> aggregation,
PrimitiveObjectInspector oi, Object parameter) {
- BigDecimal value = PrimitiveObjectInspectorUtils.getBigDecimal(parameter, oi);
+ HiveDecimal value = PrimitiveObjectInspectorUtils.getHiveDecimal(parameter, oi);
aggregation.count++;
- aggregation.sum = aggregation.sum.add(value);
-
+ if (aggregation.sum != null) {
+ try {
+ aggregation.sum = aggregation.sum.add(value);
+ } catch (NumberFormatException e) {
+ aggregation.sum = null;
+ }
+ }
}
@Override
- protected void doMerge(AverageAggregationBuffer<BigDecimal> aggregation, Long partialCount,
+ protected void doMerge(AverageAggregationBuffer<HiveDecimal> aggregation, Long partialCount,
ObjectInspector sumFieldOI, Object partialSum) {
- BigDecimal value = ((BigDecimalObjectInspector)sumFieldOI).getPrimitiveJavaObject(partialSum);
+ HiveDecimal value = ((HiveDecimalObjectInspector)sumFieldOI).getPrimitiveJavaObject(partialSum);
+ if (value == null) {
+ aggregation.sum = null;
+ }
aggregation.count += partialCount;
- aggregation.sum = aggregation.sum.add(value);
+ if (aggregation.sum != null) {
+ try {
+ aggregation.sum = aggregation.sum.add(value);
+ } catch (NumberFormatException e) {
+ aggregation.sum = null;
+ }
+ }
}
@Override
- protected void doTerminatePartial(AverageAggregationBuffer<BigDecimal> aggregation) {
- if(partialResult[1] == null) {
- partialResult[1] = new BigDecimalWritable(BigDecimal.ZERO);
+ protected void doTerminatePartial(AverageAggregationBuffer<HiveDecimal> aggregation) {
+ if(partialResult[1] == null && aggregation.sum != null) {
+ partialResult[1] = new HiveDecimalWritable(HiveDecimal.ZERO);
}
((LongWritable) partialResult[0]).set(aggregation.count);
- ((BigDecimalWritable) partialResult[1]).set(aggregation.sum);
+ if (aggregation.sum != null) {
+ ((HiveDecimalWritable) partialResult[1]).set(aggregation.sum);
+ } else {
+ partialResult[1] = null;
+ }
}
@Override
- protected Object doTerminate(AverageAggregationBuffer<BigDecimal> aggregation) {
- if(aggregation.count == 0) {
+ protected Object doTerminate(AverageAggregationBuffer<HiveDecimal> aggregation) {
+ if(aggregation.count == 0 || aggregation.sum == null) {
return null;
} else {
- BigDecimalWritable result = new BigDecimalWritable(BigDecimal.ZERO);
- result.set(aggregation.sum.divide(new BigDecimal(aggregation.count),
- UDFOPDivide.MAX_SCALE, RoundingMode.HALF_UP));
+ HiveDecimalWritable result = new HiveDecimalWritable(HiveDecimal.ZERO);
+ try {
+ result.set(aggregation.sum.divide(new HiveDecimal(aggregation.count)));
+ } catch (NumberFormatException e) {
+ result = null;
+ }
return result;
}
}
+
@Override
public AggregationBuffer getNewAggregationBuffer() throws HiveException {
- AverageAggregationBuffer<BigDecimal> result = new AverageAggregationBuffer<BigDecimal>();
+ AverageAggregationBuffer<HiveDecimal> result = new AverageAggregationBuffer<HiveDecimal>();
reset(result);
return result;
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFSum.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFSum.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFSum.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFSum.java Wed Apr 10 00:38:52 2013
@@ -17,16 +17,15 @@
*/
package org.apache.hadoop.hive.ql.udf.generic;
-import java.math.BigDecimal;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.parse.SemanticException;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
@@ -70,7 +69,7 @@ public class GenericUDAFSum extends Abst
case STRING:
return new GenericUDAFSumDouble();
case DECIMAL:
- return new GenericUDAFSumBigDecimal();
+ return new GenericUDAFSumHiveDecimal();
case BOOLEAN:
default:
throw new UDFArgumentTypeException(0,
@@ -80,40 +79,40 @@ public class GenericUDAFSum extends Abst
}
/**
- * GenericUDAFSumBigDecimal.
+ * GenericUDAFSumHiveDecimal.
*
*/
- public static class GenericUDAFSumBigDecimal extends GenericUDAFEvaluator {
+ public static class GenericUDAFSumHiveDecimal extends GenericUDAFEvaluator {
private PrimitiveObjectInspector inputOI;
- private BigDecimalWritable result;
+ private HiveDecimalWritable result;
@Override
public ObjectInspector init(Mode m, ObjectInspector[] parameters) throws HiveException {
assert (parameters.length == 1);
super.init(m, parameters);
- result = new BigDecimalWritable(BigDecimal.ZERO);
+ result = new HiveDecimalWritable(HiveDecimal.ZERO);
inputOI = (PrimitiveObjectInspector) parameters[0];
- return PrimitiveObjectInspectorFactory.writableBigDecimalObjectInspector;
+ return PrimitiveObjectInspectorFactory.writableHiveDecimalObjectInspector;
}
/** class for storing decimal sum value. */
- static class SumBigDecimalAgg implements AggregationBuffer {
+ static class SumHiveDecimalAgg implements AggregationBuffer {
boolean empty;
- BigDecimal sum;
+ HiveDecimal sum;
}
@Override
public AggregationBuffer getNewAggregationBuffer() throws HiveException {
- SumBigDecimalAgg agg = new SumBigDecimalAgg();
+ SumHiveDecimalAgg agg = new SumHiveDecimalAgg();
reset(agg);
return agg;
}
@Override
public void reset(AggregationBuffer agg) throws HiveException {
- SumBigDecimalAgg bdAgg = (SumBigDecimalAgg) agg;
+ SumHiveDecimalAgg bdAgg = (SumHiveDecimalAgg) agg;
bdAgg.empty = true;
- bdAgg.sum = BigDecimal.ZERO;
+ bdAgg.sum = HiveDecimal.ZERO;
}
boolean warned = false;
@@ -143,17 +142,26 @@ public class GenericUDAFSum extends Abst
@Override
public void merge(AggregationBuffer agg, Object partial) throws HiveException {
if (partial != null) {
- SumBigDecimalAgg myagg = (SumBigDecimalAgg) agg;
+ SumHiveDecimalAgg myagg = (SumHiveDecimalAgg) agg;
+ if (myagg.sum == null) {
+ return;
+ }
+
myagg.empty = false;
- myagg.sum = myagg.sum.add(
- PrimitiveObjectInspectorUtils.getBigDecimal(partial, inputOI));
+
+ try {
+ myagg.sum = myagg.sum.add(
+ PrimitiveObjectInspectorUtils.getHiveDecimal(partial, inputOI));
+ } catch (NumberFormatException e) {
+ myagg.sum = null;
+ }
}
}
@Override
public Object terminate(AggregationBuffer agg) throws HiveException {
- SumBigDecimalAgg myagg = (SumBigDecimalAgg) agg;
- if (myagg.empty) {
+ SumHiveDecimalAgg myagg = (SumHiveDecimalAgg) agg;
+ if (myagg.empty || myagg.sum == null) {
return null;
}
result.set(myagg.sum);
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect2.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect2.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect2.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect2.java Wed Apr 10 00:38:52 2013
@@ -20,16 +20,16 @@ package org.apache.hadoop.hive.ql.udf.ge
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.math.BigDecimal;
import java.sql.Timestamp;
+import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.UDFType;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
@@ -166,7 +166,7 @@ public class GenericUDFReflect2 extends
((BytesWritable)returnObj).set((byte[])result, 0, ((byte[]) result).length);
return returnObj;
case DECIMAL:
- ((BigDecimalWritable)returnObj).set((BigDecimal)result);
+ ((HiveDecimalWritable)returnObj).set((HiveDecimal)result);
return returnObj;
}
throw new HiveException("Invalid type " + returnOI.getPrimitiveCategory());
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDecimal.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDecimal.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDecimal.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDecimal.java Wed Apr 10 00:38:52 2013
@@ -23,14 +23,14 @@ import org.apache.hadoop.hive.ql.exec.UD
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
-import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorConverter.BigDecimalConverter;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorConverter.HiveDecimalConverter;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
@Description(name = "decimal", value = "_FUNC_(a) - cast a to decimal")
public class GenericUDFToDecimal extends GenericUDF {
private PrimitiveObjectInspector argumentOI;
- private BigDecimalConverter bdConverter;
+ private HiveDecimalConverter bdConverter;
@Override
public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
@@ -46,9 +46,9 @@ public class GenericUDFToDecimal extends
"The function DECIMAL takes only primitive types");
}
- bdConverter = new BigDecimalConverter(argumentOI,
- PrimitiveObjectInspectorFactory.writableBigDecimalObjectInspector);
- return PrimitiveObjectInspectorFactory.writableBigDecimalObjectInspector;
+ bdConverter = new HiveDecimalConverter(argumentOI,
+ PrimitiveObjectInspectorFactory.writableHiveDecimalObjectInspector);
+ return PrimitiveObjectInspectorFactory.writableHiveDecimalObjectInspector;
}
@Override
Modified: hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java (original)
+++ hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java Wed Apr 10 00:38:52 2013
@@ -28,7 +28,7 @@ import org.apache.hadoop.hive.serde2.typ
import org.apache.hadoop.hive.serde.serdeConstants;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
-import org.apache.hadoop.hive.serde2.io.BigDecimalWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.hive.serde2.io.TimestampWritable;
@@ -37,11 +37,11 @@ public class TestFunctionRegistry extend
public class TestUDF {
public void same(DoubleWritable x, DoubleWritable y) {}
- public void same(BigDecimalWritable x, BigDecimalWritable y) {}
- public void one(IntWritable x, BigDecimalWritable y) {}
+ public void same(HiveDecimalWritable x, HiveDecimalWritable y) {}
+ public void one(IntWritable x, HiveDecimalWritable y) {}
public void one(IntWritable x, DoubleWritable y) {}
public void one(IntWritable x, IntWritable y) {}
- public void mismatch(TimestampWritable x, BigDecimalWritable y) {}
+ public void mismatch(TimestampWritable x, HiveDecimalWritable y) {}
public void mismatch(BytesWritable x, DoubleWritable y) {}
}
@@ -90,16 +90,16 @@ public class TestFunctionRegistry extend
DoubleWritable.class, DoubleWritable.class, false);
verify(TestUDF.class, "same", TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.decimalTypeInfo,
- BigDecimalWritable.class, BigDecimalWritable.class, false);
+ HiveDecimalWritable.class, HiveDecimalWritable.class, false);
verify(TestUDF.class, "same", TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.doubleTypeInfo,
- BigDecimalWritable.class, BigDecimalWritable.class, false);
+ HiveDecimalWritable.class, HiveDecimalWritable.class, false);
verify(TestUDF.class, "same", TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.decimalTypeInfo,
- BigDecimalWritable.class, BigDecimalWritable.class, false);
+ HiveDecimalWritable.class, HiveDecimalWritable.class, false);
verify(TestUDF.class, "one", TypeInfoFactory.intTypeInfo, TypeInfoFactory.decimalTypeInfo,
- IntWritable.class, BigDecimalWritable.class, false);
+ IntWritable.class, HiveDecimalWritable.class, false);
verify(TestUDF.class, "one", TypeInfoFactory.intTypeInfo, TypeInfoFactory.floatTypeInfo,
IntWritable.class, DoubleWritable.class, false);
Added: hive/trunk/ql/src/test/queries/clientpositive/decimal_precision.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/decimal_precision.q?rev=1466305&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/decimal_precision.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/decimal_precision.q Wed Apr 10 00:38:52 2013
@@ -0,0 +1,20 @@
+DROP TABLE IF EXISTS DECIMAL_PRECISION;
+
+CREATE TABLE DECIMAL_PRECISION(dec decimal)
+ROW FORMAT DELIMITED
+ FIELDS TERMINATED BY ' '
+STORED AS TEXTFILE;
+
+LOAD DATA LOCAL INPATH '../data/files/kv8.txt' INTO TABLE DECIMAL_PRECISION;
+
+SELECT * FROM DECIMAL_PRECISION ORDER BY dec;
+
+SELECT dec, dec + 1, dec - 1 FROM DECIMAL_PRECISION ORDER BY dec;
+SELECT dec, dec * 2, dec / 3 FROM DECIMAL_PRECISION ORDER BY dec;
+SELECT dec, dec / 9 FROM DECIMAL_PRECISION ORDER BY dec;
+SELECT dec, dec / 27 FROM DECIMAL_PRECISION ORDER BY dec;
+SELECT dec, dec * dec FROM DECIMAL_PRECISION ORDER BY dec;
+
+SELECT avg(dec), sum(dec) FROM DECIMAL_PRECISION;
+
+DROP TABLE DECIMAL_PRECISION;
Modified: hive/trunk/ql/src/test/results/clientpositive/decimal_3.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/decimal_3.q.out?rev=1466305&r1=1466304&r2=1466305&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/decimal_3.q.out (original)
+++ hive/trunk/ql/src/test/results/clientpositive/decimal_3.q.out Wed Apr 10 00:38:52 2013
@@ -27,8 +27,10 @@ POSTHOOK: query: SELECT * FROM DECIMAL_3
POSTHOOK: type: QUERY
POSTHOOK: Input: default@decimal_3
#### A masked pattern was here ####
+NULL 0
+NULL 0
-1234567890.123456789 -1234567890
--4.4E+3 4400
+-4400 4400
-1255.49 -1255
-1.122 -11
-1.12 -1
@@ -38,7 +40,6 @@ POSTHOOK: Input: default@decimal_3
-0.3 0
0 0
0 0
-1E-99 0
0.01 0
0.02 0
0.1 0
@@ -57,14 +58,13 @@ POSTHOOK: Input: default@decimal_3
3.14 3
3.14 3
3.14 4
-1E+1 10
-2E+1 20
-1E+2 100
+10 10
+20 20
+100 100
124 124
125.2 125
-2E+2 200
+200 200
1234567890.12345678 1234567890
-1E+99 0
PREHOOK: query: SELECT * FROM DECIMAL_3 ORDER BY key DESC, value DESC
PREHOOK: type: QUERY
PREHOOK: Input: default@decimal_3
@@ -73,14 +73,13 @@ POSTHOOK: query: SELECT * FROM DECIMAL_3
POSTHOOK: type: QUERY
POSTHOOK: Input: default@decimal_3
#### A masked pattern was here ####
-1E+99 0
1234567890.12345678 1234567890
-2E+2 200
+200 200
125.2 125
124 124
-1E+2 100
-2E+1 20
-1E+1 10
+100 100
+20 20
+10 10
3.14 4
3.14 3
3.14 3
@@ -99,7 +98,6 @@ POSTHOOK: Input: default@decimal_3
0.1 0
0.02 0
0.01 0
-1E-99 0
0 0
0 0
-0.3 0
@@ -109,8 +107,10 @@ POSTHOOK: Input: default@decimal_3
-1.12 -1
-1.122 -11
-1255.49 -1255
--4.4E+3 4400
+-4400 4400
-1234567890.123456789 -1234567890
+NULL 0
+NULL 0
PREHOOK: query: SELECT * FROM DECIMAL_3 ORDER BY key, value
PREHOOK: type: QUERY
PREHOOK: Input: default@decimal_3
@@ -119,8 +119,10 @@ POSTHOOK: query: SELECT * FROM DECIMAL_3
POSTHOOK: type: QUERY
POSTHOOK: Input: default@decimal_3
#### A masked pattern was here ####
+NULL 0
+NULL 0
-1234567890.123456789 -1234567890
--4.4E+3 4400
+-4400 4400
-1255.49 -1255
-1.122 -11
-1.12 -1
@@ -130,7 +132,6 @@ POSTHOOK: Input: default@decimal_3
-0.3 0
0 0
0 0
-1E-99 0
0.01 0
0.02 0
0.1 0
@@ -149,14 +150,13 @@ POSTHOOK: Input: default@decimal_3
3.14 3
3.14 3
3.14 4
-1E+1 10
-2E+1 20
-1E+2 100
+10 10
+20 20
+100 100
124 124
125.2 125
-2E+2 200
+200 200
1234567890.12345678 1234567890
-1E+99 0
PREHOOK: query: SELECT DISTINCT key FROM DECIMAL_3 ORDER BY key
PREHOOK: type: QUERY
PREHOOK: Input: default@decimal_3
@@ -165,8 +165,9 @@ POSTHOOK: query: SELECT DISTINCT key FRO
POSTHOOK: type: QUERY
POSTHOOK: Input: default@decimal_3
#### A masked pattern was here ####
+NULL
-1234567890.123456789
--4.4E+3
+-4400
-1255.49
-1.122
-1.12
@@ -174,7 +175,6 @@ POSTHOOK: Input: default@decimal_3
-0.33
-0.3
0
-1E-99
0.01
0.02
0.1
@@ -188,14 +188,13 @@ POSTHOOK: Input: default@decimal_3
1.122
2
3.14
-1E+1
-2E+1
-1E+2
+10
+20
+100
124
125.2
-2E+2
+200
1234567890.12345678
-1E+99
PREHOOK: query: SELECT key, sum(value) FROM DECIMAL_3 GROUP BY key ORDER BY key
PREHOOK: type: QUERY
PREHOOK: Input: default@decimal_3
@@ -204,8 +203,9 @@ POSTHOOK: query: SELECT key, sum(value)
POSTHOOK: type: QUERY
POSTHOOK: Input: default@decimal_3
#### A masked pattern was here ####
+NULL 0
-1234567890.123456789 -1234567890
--4.4E+3 4400
+-4400 4400
-1255.49 -1255
-1.122 -11
-1.12 -2
@@ -213,7 +213,6 @@ POSTHOOK: Input: default@decimal_3
-0.33 0
-0.3 0
0 0
-1E-99 0
0.01 0
0.02 0
0.1 0
@@ -227,14 +226,13 @@ POSTHOOK: Input: default@decimal_3
1.122 1
2 4
3.14 13
-1E+1 10
-2E+1 20
-1E+2 100
+10 10
+20 20
+100 100
124 124
125.2 125
-2E+2 200
+200 200
1234567890.12345678 1234567890
-1E+99 0
PREHOOK: query: SELECT value, sum(key) FROM DECIMAL_3 GROUP BY value ORDER BY value
PREHOOK: type: QUERY
PREHOOK: Input: default@decimal_3
@@ -247,18 +245,18 @@ POSTHOOK: Input: default@decimal_3
-1255 -1255.49
-11 -1.122
-1 -2.24
-0 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
+0 0.33
1 5.2419999999999999999999999
2 4
3 9.42
4 3.14
-10 1E+1
-20 2E+1
-100 1E+2
+10 10
+20 20
+100 100
124 124
125 125.2
-200 2E+2
-4400 -4.4E+3
+200 200
+4400 -4400
1234567890 1234567890.12345678
PREHOOK: query: SELECT * FROM DECIMAL_3 a JOIN DECIMAL_3 b ON (a.key = b.key) ORDER BY a.key, a.value, b.value
PREHOOK: type: QUERY
@@ -269,7 +267,7 @@ POSTHOOK: type: QUERY
POSTHOOK: Input: default@decimal_3
#### A masked pattern was here ####
-1234567890.123456789 -1234567890 -1234567890.123456789 -1234567890
--4.4E+3 4400 -4.4E+3 4400
+-4400 4400 -4400 4400
-1255.49 -1255 -1255.49 -1255
-1.122 -11 -1.122 -11
-1.12 -1 -1.12 -1
@@ -283,7 +281,6 @@ POSTHOOK: Input: default@decimal_3
0 0 0 0
0 0 0 0
0 0 0 0
-1E-99 0 1E-99 0
0.01 0 0.01 0
0.02 0 0.02 0
0.1 0 0.1 0
@@ -318,14 +315,13 @@ POSTHOOK: Input: default@decimal_3
3.14 4 3.14 3
3.14 4 3.14 3
3.14 4 3.14 4
-1E+1 10 1E+1 10
-2E+1 20 2E+1 20
-1E+2 100 1E+2 100
+10 10 10 10
+20 20 20 20
+100 100 100 100
124 124 124 124
125.2 125 125.2 125
-2E+2 200 2E+2 200
+200 200 200 200
1234567890.12345678 1234567890 1234567890.12345678 1234567890
-1E+99 0 1E+99 0
PREHOOK: query: SELECT * FROM DECIMAL_3 WHERE key=3.14 ORDER BY key, value
PREHOOK: type: QUERY
PREHOOK: Input: default@decimal_3