Index: serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java =================================================================== --- serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java (revision 1669425) +++ serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java (working copy) @@ -189,7 +189,7 @@ String columnName = columnNames.get(i); Object datum = record.get(columnName); Schema datumSchema = record.getSchema().getField(columnName).schema(); - Schema.Field field = fileSchema.getField(columnName); + Schema.Field field = AvroSerdeUtils.isNullableType(fileSchema)?AvroSerdeUtils.getOtherTypeFromNullableType(fileSchema).getField(columnName):fileSchema.getField(columnName); objectRow.add(worker(datum, field == null ? null : field.schema(), datumSchema, columnType)); } Index: serde/src/test/org/apache/hadoop/hive/serde2/avro/TestAvroDeserializer.java =================================================================== --- serde/src/test/org/apache/hadoop/hive/serde2/avro/TestAvroDeserializer.java (revision 1669425) +++ serde/src/test/org/apache/hadoop/hive/serde2/avro/TestAvroDeserializer.java (working copy) @@ -185,9 +185,7 @@ } - @Test - public void canDeserializeRecords() throws SerDeException, IOException { - Schema s = AvroSerdeUtils.getSchemaFor(TestAvroObjectInspectorGenerator.RECORD_SCHEMA); + public void canDeserializeRecordsInternal(Schema s, Schema fileSchema) throws SerDeException, IOException { GenericData.Record record = new GenericData.Record(s); GenericData.Record innerRecord = new GenericData.Record(s.getField("aRecord").schema()); innerRecord.put("int1", 42); @@ -196,7 +194,7 @@ record.put("aRecord", innerRecord); assertTrue(GENERIC_DATA.validate(s, record)); - AvroGenericRecordWritable garw = Utils.serializeAndDeserializeRecord(record); + AvroGenericRecordWritable garw = Utils.serializeAndDeserializeRecord(record, fileSchema); AvroObjectInspectorGenerator aoig = new AvroObjectInspectorGenerator(s); @@ -232,6 +230,19 @@ assertEquals(42432234234l, innerRecord2OI.getStructFieldData(innerRecord2, allStructFieldRefs1.get(2))); } + @Test + public void canDeserializeRecords() throws SerDeException, IOException { + Schema s = AvroSerdeUtils.getSchemaFor(TestAvroObjectInspectorGenerator.RECORD_SCHEMA); + canDeserializeRecordsInternal(s, s); + } + + @Test + public void canDeserializeNullableRecords() throws SerDeException, IOException { + Schema s = AvroSerdeUtils.getSchemaFor(TestAvroObjectInspectorGenerator.RECORD_SCHEMA); + Schema fileSchema = AvroSerdeUtils.getSchemaFor(TestAvroObjectInspectorGenerator.NULLABLE_RECORD_SCHEMA); + canDeserializeRecordsInternal(s, fileSchema); + } + private class ResultPair { // Because Pairs give Java the vapors. public final ObjectInspector oi; public final Object value; Index: serde/src/test/org/apache/hadoop/hive/serde2/avro/TestAvroObjectInspectorGenerator.java =================================================================== --- serde/src/test/org/apache/hadoop/hive/serde2/avro/TestAvroObjectInspectorGenerator.java (revision 1669425) +++ serde/src/test/org/apache/hadoop/hive/serde2/avro/TestAvroObjectInspectorGenerator.java (working copy) @@ -100,6 +100,7 @@ " }\n" + " ]\n" + "}"; + public static final String NULLABLE_RECORD_SCHEMA = "[\"null\", " + RECORD_SCHEMA + "]"; public static final String UNION_SCHEMA = "{\n" + " \"namespace\": \"test.a.rossa\",\n" + " \"name\": \"oneUnion\",\n" + Index: serde/src/test/org/apache/hadoop/hive/serde2/avro/Utils.java =================================================================== --- serde/src/test/org/apache/hadoop/hive/serde2/avro/Utils.java (revision 1669425) +++ serde/src/test/org/apache/hadoop/hive/serde2/avro/Utils.java (working copy) @@ -24,6 +24,7 @@ import java.io.IOException; import java.rmi.server.UID; +import org.apache.avro.Schema; import org.apache.avro.generic.GenericData; class Utils { @@ -31,10 +32,15 @@ // chance to muck with the bytes and we're working against real Avro data. public static AvroGenericRecordWritable serializeAndDeserializeRecord(GenericData.Record record) throws IOException { + return serializeAndDeserializeRecord(record, record.getSchema()); + } + + public static AvroGenericRecordWritable + serializeAndDeserializeRecord(GenericData.Record record, Schema fileSchema) throws IOException { AvroGenericRecordWritable garw = new AvroGenericRecordWritable(record); garw.setRecordReaderID(new UID()); // Assuming file schema is the same as record schema for testing purpose. - garw.setFileSchema(record.getSchema()); + garw.setFileSchema(fileSchema); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream daos = new DataOutputStream(baos); garw.write(daos);