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));