Author: szehon
Date: Sat Jul 12 22:08:29 2014
New Revision: 1610069
URL: http://svn.apache.org/r1610069
Log:
HIVE-7279: UDF format_number() does not work on DECIMAL types (Wilbur Yang via
Szehon)
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java
hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong7.q.out
hive/trunk/ql/src/test/results/clientpositive/udf_format_number.q.out
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java?rev=1610069&r1=1610068&r2=1610069&view=diff
==============================================================================
---
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java
(original)
+++
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java
Sat Jul 12 22:08:29 2014
@@ -20,6 +20,7 @@ package org.apache.hadoop.hive.ql.udf.ge
import java.text.DecimalFormat;
+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;
@@ -32,6 +33,7 @@ import org.apache.hadoop.hive.serde2.obj
import
org.apache.hadoop.hive.serde2.objectinspector.primitive.FloatObjectInspector;
import
org.apache.hadoop.hive.serde2.objectinspector.primitive.IntObjectInspector;
import
org.apache.hadoop.hive.serde2.objectinspector.primitive.LongObjectInspector;
+import
org.apache.hadoop.hive.serde2.objectinspector.primitive.HiveDecimalObjectInspector;
import
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.io.Text;
@@ -78,7 +80,8 @@ public class GenericUDFFormatNumber exte
+ " or \"" + serdeConstants.INT_TYPE_NAME + "\""
+ " or \"" + serdeConstants.BIGINT_TYPE_NAME + "\""
+ " or \"" + serdeConstants.DOUBLE_TYPE_NAME + "\""
- + " or \"" + serdeConstants.FLOAT_TYPE_NAME + "\", but \""
+ + " or \"" + serdeConstants.FLOAT_TYPE_NAME + "\""
+ + " or \"" + serdeConstants.DECIMAL_TYPE_NAME + "\", but \""
+ arguments[0].getTypeName() + "\" was found.");
}
@@ -104,8 +107,9 @@ public class GenericUDFFormatNumber exte
case SHORT:
case INT:
case LONG:
- case FLOAT:
case DOUBLE:
+ case FLOAT:
+ case DECIMAL:
break;
default:
throw new UDFArgumentTypeException(0, "Argument 1"
@@ -115,7 +119,8 @@ public class GenericUDFFormatNumber exte
+ " or \"" + serdeConstants.INT_TYPE_NAME + "\""
+ " or \"" + serdeConstants.BIGINT_TYPE_NAME + "\""
+ " or \"" + serdeConstants.DOUBLE_TYPE_NAME + "\""
- + " or \"" + serdeConstants.FLOAT_TYPE_NAME + "\", but \""
+ + " or \"" + serdeConstants.FLOAT_TYPE_NAME + "\""
+ + " or \"" + serdeConstants.DECIMAL_TYPE_NAME + "\", but \""
+ arguments[0].getTypeName() + "\" was found.");
}
@@ -168,6 +173,7 @@ public class GenericUDFFormatNumber exte
double xDoubleValue = 0.0;
float xFloatValue = 0.0f;
+ HiveDecimal xDecimalValue = null;
int xIntValue = 0;
long xLongValue = 0L;
@@ -182,6 +188,11 @@ public class GenericUDFFormatNumber exte
xFloatValue = ((FloatObjectInspector)
argumentOIs[0]).get(arguments[0].get());
resultText.set(numberFormat.format(xFloatValue));
break;
+ case DECIMAL:
+ xDecimalValue = ((HiveDecimalObjectInspector) argumentOIs[0])
+ .getPrimitiveJavaObject(arguments[0].get());
+ resultText.set(numberFormat.format(xDecimalValue.bigDecimalValue()));
+ break;
case BYTE:
case SHORT:
case INT:
@@ -199,7 +210,8 @@ public class GenericUDFFormatNumber exte
+ " or \"" + serdeConstants.INT_TYPE_NAME + "\""
+ " or \"" + serdeConstants.BIGINT_TYPE_NAME + "\""
+ " or \"" + serdeConstants.DOUBLE_TYPE_NAME + "\""
- + " or \"" + serdeConstants.FLOAT_TYPE_NAME + "\", but \""
+ + " or \"" + serdeConstants.FLOAT_TYPE_NAME + "\""
+ + " or \"" + serdeConstants.DECIMAL_TYPE_NAME + "\", but \""
+ argumentOIs[0].getTypeName() + "\" was found.");
}
return resultText;
Modified: hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q?rev=1610069&r1=1610068&r2=1610069&view=diff
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q (original)
+++ hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q Sat Jul
12 22:08:29 2014
@@ -63,3 +63,11 @@ SELECT format_number(CAST(12332.123456 A
format_number(CAST(12332.1 AS FLOAT), 4),
format_number(CAST(-12332.2 AS FLOAT), 0)
FROM src tablesample (1 rows);
+
+-- decimals
+SELECT format_number(12332.123456BD, 4),
+ format_number(12332.123456BD, 2),
+ format_number(12332.1BD, 4),
+ format_number(-12332.2BD, 0),
+ format_number(CAST(12332.567 AS DECIMAL(8, 1)), 4)
+FROM src tablesample (1 rows);
Modified:
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out?rev=1610069&r1=1610068&r2=1610069&view=diff
==============================================================================
---
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out
(original)
+++
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out
Sat Jul 12 22:08:29 2014
@@ -1 +1 @@
-FAILED: SemanticException [Error 10016]: Line 2:21 Argument type mismatch
'321.23': Argument 1 of function FORMAT_NUMBER must be "tinyint" or "smallint"
or "int" or "bigint" or "double" or "float", but "array<double>" was found.
+FAILED: SemanticException [Error 10016]: Line 2:21 Argument type mismatch
'321.23': Argument 1 of function FORMAT_NUMBER must be "tinyint" or "smallint"
or "int" or "bigint" or "double" or "float" or "decimal", but "array<double>"
was found.
Modified:
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong7.q.out
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong7.q.out?rev=1610069&r1=1610068&r2=1610069&view=diff
==============================================================================
---
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong7.q.out
(original)
+++
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong7.q.out
Sat Jul 12 22:08:29 2014
@@ -1 +1 @@
-FAILED: SemanticException [Error 10016]: Line 2:21 Argument type mismatch '4':
Argument 1 of function FORMAT_NUMBER must be "tinyint" or "smallint" or "int"
or "bigint" or "double" or "float", but "string" was found.
+FAILED: SemanticException [Error 10016]: Line 2:21 Argument type mismatch '4':
Argument 1 of function FORMAT_NUMBER must be "tinyint" or "smallint" or "int"
or "bigint" or "double" or "float" or "decimal", but "string" was found.
Modified: hive/trunk/ql/src/test/results/clientpositive/udf_format_number.q.out
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/udf_format_number.q.out?rev=1610069&r1=1610068&r2=1610069&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/udf_format_number.q.out
(original)
+++ hive/trunk/ql/src/test/results/clientpositive/udf_format_number.q.out Sat
Jul 12 22:08:29 2014
@@ -188,3 +188,24 @@ POSTHOOK: type: QUERY
POSTHOOK: Input: default@src
#### A masked pattern was here ####
12,332.1230 12,332.0996 -12,332
+PREHOOK: query: -- decimals
+SELECT format_number(12332.123456BD, 4),
+ format_number(12332.123456BD, 2),
+ format_number(12332.1BD, 4),
+ format_number(-12332.2BD, 0),
+ format_number(CAST(12332.567 AS DECIMAL(8, 1)), 4)
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: -- decimals
+SELECT format_number(12332.123456BD, 4),
+ format_number(12332.123456BD, 2),
+ format_number(12332.1BD, 4),
+ format_number(-12332.2BD, 0),
+ format_number(CAST(12332.567 AS DECIMAL(8, 1)), 4)
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+12,332.1235 12,332.12 12,332.1000 -12,332 12,332.6000