Repository: hive
Updated Branches:
  refs/heads/master de260b45d -> d4c1fdcf2


HIVE-13251: hive can't read the decimal in AVRO file generated from previous 
version (Reviewed by Szehon Ho)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/d4c1fdcf
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/d4c1fdcf
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/d4c1fdcf

Branch: refs/heads/master
Commit: d4c1fdcf26ad8a12d77841def6afead86377b1ac
Parents: de260b4
Author: Aihua Xu <aihu...@apache.org>
Authored: Thu Mar 10 10:29:40 2016 -0500
Committer: Aihua Xu <aihu...@apache.org>
Committed: Mon Mar 14 11:07:24 2016 -0400

----------------------------------------------------------------------
 data/files/dec_old.avro                         | Bin 0 -> 331 bytes
 .../test/queries/clientnegative/avro_decimal.q  |  17 ++++++
 .../queries/clientpositive/avro_decimal_old.q   |  14 +++++
 .../results/clientnegative/avro_decimal.q.out   |  22 +++++++
 .../clientpositive/avro_decimal_old.q.out       |  60 +++++++++++++++++++
 .../hive/serde2/avro/AvroDeserializer.java      |   2 +-
 6 files changed, 114 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/d4c1fdcf/data/files/dec_old.avro
----------------------------------------------------------------------
diff --git a/data/files/dec_old.avro b/data/files/dec_old.avro
new file mode 100644
index 0000000..bf87763
Binary files /dev/null and b/data/files/dec_old.avro differ

http://git-wip-us.apache.org/repos/asf/hive/blob/d4c1fdcf/ql/src/test/queries/clientnegative/avro_decimal.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/avro_decimal.q 
b/ql/src/test/queries/clientnegative/avro_decimal.q
new file mode 100644
index 0000000..538e687
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/avro_decimal.q
@@ -0,0 +1,17 @@
+DROP TABLE IF EXISTS avro_dec;
+
+CREATE TABLE `avro_dec`(
+  `name` string COMMENT 'from deserializer',
+  `value` decimal(5,2) COMMENT 'from deserializer')
+COMMENT 'just drop the schema right into the HQL'
+ROW FORMAT SERDE
+  'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
+STORED AS INPUTFORMAT
+  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
+OUTPUTFORMAT
+  'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
+TBLPROPERTIES (
+  'numFiles'='1',
+  
'avro.schema.literal'='{\"namespace\":\"com.howdy\",\"name\":\"some_schema\",\"type\":\"record\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"value\",\"type\":{\"type\":\"bytes\",\"logicalType\":\"decimal\",\"precision\":"5",\"scale\":"2"}}]}'
+);
+

http://git-wip-us.apache.org/repos/asf/hive/blob/d4c1fdcf/ql/src/test/queries/clientpositive/avro_decimal_old.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/avro_decimal_old.q 
b/ql/src/test/queries/clientpositive/avro_decimal_old.q
new file mode 100644
index 0000000..9610c47
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/avro_decimal_old.q
@@ -0,0 +1,14 @@
+DROP TABLE IF EXISTS avro_dec_old;
+
+CREATE TABLE `avro_dec_old`(
+  `name` string COMMENT 'from deserializer',
+  `value` decimal(4,1) COMMENT 'from deserializer')
+STORED AS AVRO;
+
+DESC avro_dec_old;
+
+LOAD DATA LOCAL INPATH '../../data/files/dec_old.avro' into TABLE avro_dec_old;
+
+select value from avro_dec_old;
+
+DROP TABLE avro_dec_old;

http://git-wip-us.apache.org/repos/asf/hive/blob/d4c1fdcf/ql/src/test/results/clientnegative/avro_decimal.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/avro_decimal.q.out 
b/ql/src/test/results/clientnegative/avro_decimal.q.out
new file mode 100644
index 0000000..9d00d6e
--- /dev/null
+++ b/ql/src/test/results/clientnegative/avro_decimal.q.out
@@ -0,0 +1,22 @@
+PREHOOK: query: DROP TABLE IF EXISTS avro_dec
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS avro_dec
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE `avro_dec`(
+  `name` string COMMENT 'from deserializer',
+  `value` decimal(5,2) COMMENT 'from deserializer')
+COMMENT 'just drop the schema right into the HQL'
+ROW FORMAT SERDE
+  'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
+STORED AS INPUTFORMAT
+  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
+OUTPUTFORMAT
+  'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
+TBLPROPERTIES (
+  'numFiles'='1',
+  
'avro.schema.literal'='{\"namespace\":\"com.howdy\",\"name\":\"some_schema\",\"type\":\"record\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"value\",\"type\":{\"type\":\"bytes\",\"logicalType\":\"decimal\",\"precision\":"5",\"scale\":"2"}}]}'
+)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@avro_dec
+FAILED: Execution Error, return code 1 from 
org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: 
MetaException(message:org.apache.hadoop.hive.serde2.avro.AvroSerdeException 
Invalid precision or scale for decimal type)

http://git-wip-us.apache.org/repos/asf/hive/blob/d4c1fdcf/ql/src/test/results/clientpositive/avro_decimal_old.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/avro_decimal_old.q.out 
b/ql/src/test/results/clientpositive/avro_decimal_old.q.out
new file mode 100644
index 0000000..22efe39
--- /dev/null
+++ b/ql/src/test/results/clientpositive/avro_decimal_old.q.out
@@ -0,0 +1,60 @@
+PREHOOK: query: DROP TABLE IF EXISTS avro_dec_old
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS avro_dec_old
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE `avro_dec_old`(
+  `name` string COMMENT 'from deserializer',
+  `value` decimal(4,1) COMMENT 'from deserializer')
+STORED AS AVRO
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@avro_dec_old
+POSTHOOK: query: CREATE TABLE `avro_dec_old`(
+  `name` string COMMENT 'from deserializer',
+  `value` decimal(4,1) COMMENT 'from deserializer')
+STORED AS AVRO
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@avro_dec_old
+PREHOOK: query: DESC avro_dec_old
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@avro_dec_old
+POSTHOOK: query: DESC avro_dec_old
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@avro_dec_old
+name                   string                  from deserializer   
+value                  decimal(4,1)            from deserializer   
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/dec_old.avro' into 
TABLE avro_dec_old
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@avro_dec_old
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/dec_old.avro' into 
TABLE avro_dec_old
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@avro_dec_old
+PREHOOK: query: select value from avro_dec_old
+PREHOOK: type: QUERY
+PREHOOK: Input: default@avro_dec_old
+#### A masked pattern was here ####
+POSTHOOK: query: select value from avro_dec_old
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@avro_dec_old
+#### A masked pattern was here ####
+234.8
+77.3
+55.7
+4.3
+6.0
+12.3
+33.3
+19.0
+3.2
+79.9
+PREHOOK: query: DROP TABLE avro_dec_old
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@avro_dec_old
+PREHOOK: Output: default@avro_dec_old
+POSTHOOK: query: DROP TABLE avro_dec_old
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@avro_dec_old
+POSTHOOK: Output: default@avro_dec_old

http://git-wip-us.apache.org/repos/asf/hive/blob/d4c1fdcf/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java
----------------------------------------------------------------------
diff --git 
a/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java 
b/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java
index 4bba3d4..6165138 100644
--- a/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java
+++ b/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java
@@ -244,7 +244,7 @@ class AvroDeserializer {
 
       int scale = 0;
       try {
-        scale = 
fileSchema.getJsonProp(AvroSerDe.AVRO_PROP_SCALE).getIntValue();
+        scale = fileSchema.getJsonProp(AvroSerDe.AVRO_PROP_SCALE).asInt();
       } catch(Exception ex) {
         throw new AvroSerdeException("Failed to obtain scale value from file 
schema: " + fileSchema, ex);
       }

Reply via email to