diff --git data/files/decimal_10_0.txt data/files/decimal_10_0.txt new file mode 100644 index 0000000..30e37bf --- /dev/null +++ data/files/decimal_10_0.txt @@ -0,0 +1,2 @@ +999999999.999 +9999999999.999 diff --git ql/src/test/queries/clientpositive/decimal_10_0.q ql/src/test/queries/clientpositive/decimal_10_0.q new file mode 100644 index 0000000..02b547c --- /dev/null +++ ql/src/test/queries/clientpositive/decimal_10_0.q @@ -0,0 +1,9 @@ +DROP TABLE IF EXISTS DECIMAL; + +CREATE TABLE DECIMAL (dec decimal); + +LOAD DATA LOCAL INPATH '../../data/files/decimal_10_0.txt' OVERWRITE INTO TABLE DECIMAL; + +SELECT dec FROM DECIMAL; + +DROP TABLE DECIMAL; \ No newline at end of file diff --git ql/src/test/results/clientpositive/decimal_10_0.q.out ql/src/test/results/clientpositive/decimal_10_0.q.out new file mode 100644 index 0000000..722a0a0 --- /dev/null +++ ql/src/test/results/clientpositive/decimal_10_0.q.out @@ -0,0 +1,37 @@ +PREHOOK: query: DROP TABLE IF EXISTS DECIMAL +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE IF EXISTS DECIMAL +POSTHOOK: type: DROPTABLE +PREHOOK: query: CREATE TABLE DECIMAL (dec decimal) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +POSTHOOK: query: CREATE TABLE DECIMAL (dec decimal) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@DECIMAL +PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal_10_0.txt' OVERWRITE INTO TABLE DECIMAL +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@decimal +POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal_10_0.txt' OVERWRITE INTO TABLE DECIMAL +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@decimal +PREHOOK: query: SELECT dec FROM DECIMAL +PREHOOK: type: QUERY +PREHOOK: Input: default@decimal +#### A masked pattern was here #### +POSTHOOK: query: SELECT dec FROM DECIMAL +POSTHOOK: type: QUERY +POSTHOOK: Input: default@decimal +#### A masked pattern was here #### +1000000000 +NULL +PREHOOK: query: DROP TABLE DECIMAL +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@decimal +PREHOOK: Output: default@decimal +POSTHOOK: query: DROP TABLE DECIMAL +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@decimal +POSTHOOK: Output: default@decimal diff --git serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyHiveDecimal.java serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyHiveDecimal.java index 78cc381..fcf1ac6 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyHiveDecimal.java +++ serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyHiveDecimal.java @@ -17,6 +17,9 @@ */ package org.apache.hadoop.hive.serde2.lazy; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.ByteBuffer; import java.nio.charset.CharacterCodingException; import org.apache.commons.logging.Log; @@ -33,6 +36,7 @@ private final int precision; private final int scale; + private static final byte[] nullBytes = new byte[]{0x0, 0x0, 0x0, 0x0}; public LazyHiveDecimal(LazyHiveDecimalObjectInspector oi) { super(oi); @@ -93,4 +97,19 @@ public HiveDecimalWritable getWritableObject() { return data; } + /** + * Writes HiveDecimal object to output stream as string + * @param outputStream + * @param hiveDecimal + * @throws IOException + */ + public static void writeUTF8(OutputStream outputStream, HiveDecimal hiveDecimal) + throws IOException { + if (hiveDecimal == null) { + outputStream.write(nullBytes); + } else { + ByteBuffer b = Text.encode(hiveDecimal.toString()); + outputStream.write(b.array(), 0, b.limit()); + } + } } diff --git serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyUtils.java serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyUtils.java index 5a46237..1d62422 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyUtils.java +++ serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyUtils.java @@ -28,7 +28,6 @@ import java.util.Properties; import org.apache.commons.codec.binary.Base64; -import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.serde.serdeConstants; import org.apache.hadoop.hive.serde2.SerDeException; import org.apache.hadoop.hive.serde2.io.HiveCharWritable; @@ -261,9 +260,8 @@ public static void writePrimitiveUTF8(OutputStream out, Object o, break; } case DECIMAL: { - HiveDecimal bd = ((HiveDecimalObjectInspector) oi).getPrimitiveJavaObject(o); - ByteBuffer b = Text.encode(bd.toString()); - out.write(b.array(), 0, b.limit()); + LazyHiveDecimal.writeUTF8(out, + ((HiveDecimalObjectInspector) oi).getPrimitiveJavaObject(o)); break; } default: {