You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by br...@apache.org on 2014/10/30 21:20:31 UTC

svn commit: r1635602 - in /hive/branches/branch-0.14: ./ data/files/ ql/src/test/queries/clientpositive/ ql/src/test/results/clientpositive/ serde/src/java/org/apache/hadoop/hive/serde2/avro/

Author: brock
Date: Thu Oct 30 20:20:30 2014
New Revision: 1635602

URL: http://svn.apache.org/r1635602
Log:
Merge HIVE-8577 - Cannot deserialize Avro schema with a map<string,string> with null values

Added:
    hive/branches/branch-0.14/data/files/map_null_schema.avro
      - copied unchanged from r1635373, hive/trunk/data/files/map_null_schema.avro
    hive/branches/branch-0.14/data/files/map_null_val.avro
      - copied unchanged from r1635373, hive/trunk/data/files/map_null_val.avro
    hive/branches/branch-0.14/ql/src/test/queries/clientpositive/avro_deserialize_map_null.q
      - copied unchanged from r1635373, hive/trunk/ql/src/test/queries/clientpositive/avro_deserialize_map_null.q
    hive/branches/branch-0.14/ql/src/test/results/clientpositive/avro_deserialize_map_null.q.out
      - copied unchanged from r1635373, hive/trunk/ql/src/test/results/clientpositive/avro_deserialize_map_null.q.out
Modified:
    hive/branches/branch-0.14/   (props changed)
    hive/branches/branch-0.14/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java

Propchange: hive/branches/branch-0.14/
------------------------------------------------------------------------------
  Merged /hive/trunk:r1635373

Modified: hive/branches/branch-0.14/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.14/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java?rev=1635602&r1=1635601&r2=1635602&view=diff
==============================================================================
--- hive/branches/branch-0.14/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java (original)
+++ hive/branches/branch-0.14/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java Thu Oct 30 20:20:30 2014
@@ -199,7 +199,7 @@ class AvroDeserializer {
     // Avro requires NULLable types to be defined as unions of some type T
     // and NULL.  This is annoying and we're going to hide it from the user.
     if(AvroSerdeUtils.isNullableType(recordSchema)) {
-      return deserializeNullableUnion(datum, fileSchema, recordSchema, columnType);
+      return deserializeNullableUnion(datum, fileSchema, recordSchema);
     }
 
     switch(columnType.getCategory()) {
@@ -289,8 +289,8 @@ class AvroDeserializer {
    * Extract either a null or the correct type from a Nullable type.  This is
    * horrible in that we rebuild the TypeInfo every time.
    */
-  private Object deserializeNullableUnion(Object datum, Schema fileSchema, Schema recordSchema,
-                                          TypeInfo columnType) throws AvroSerdeException {
+  private Object deserializeNullableUnion(Object datum, Schema fileSchema, Schema recordSchema)
+                                            throws AvroSerdeException {
     int tag = GenericData.get().resolveUnion(recordSchema, datum); // Determine index of value
     Schema schema = recordSchema.getTypes().get(tag);
     if (schema.getType().equals(Schema.Type.NULL)) {
@@ -299,8 +299,14 @@ class AvroDeserializer {
 
     Schema currentFileSchema = null;
     if (fileSchema != null) {
-       currentFileSchema =
-           fileSchema.getType() == Type.UNION ? fileSchema.getTypes().get(tag) : fileSchema;
+      if (fileSchema.getType() == Type.UNION) {
+        // The fileSchema may have the null value in a different position, so
+        // we need to get the correct tag
+        tag = GenericData.get().resolveUnion(fileSchema, datum);
+        currentFileSchema = fileSchema.getTypes().get(tag);
+      } else {
+        currentFileSchema = fileSchema;
+      }
     }
     return worker(datum, currentFileSchema, schema, SchemaToTypeInfo.generateTypeInfo(schema));