Index: eclipse-templates/.classpath
===================================================================
--- eclipse-templates/.classpath (revision 1523883)
+++ eclipse-templates/.classpath (working copy)
@@ -47,6 +47,8 @@
+
+
Index: ivy/libraries.properties
===================================================================
--- ivy/libraries.properties (revision 1523883)
+++ ivy/libraries.properties (working copy)
@@ -22,7 +22,7 @@
ant-task.version=2.0.10
antlr.version=3.4
antlr-runtime.version=3.4
-avro.version=1.7.1
+avro.version=1.7.5
datanucleus-api-jdo.version=3.2.1
datanucleus-core.version=3.2.2
datanucleus-rdbms.version=3.2.1
Index: serde/ivy.xml
===================================================================
--- serde/ivy.xml (revision 1523883)
+++ serde/ivy.xml (working copy)
@@ -40,6 +40,10 @@
transitive="false"/>
+
+
Index: serde/src/test/org/apache/hadoop/hive/serde2/avro/TestAvroDeserializer.java
===================================================================
--- serde/src/test/org/apache/hadoop/hive/serde2/avro/TestAvroDeserializer.java (revision 1523883)
+++ serde/src/test/org/apache/hadoop/hive/serde2/avro/TestAvroDeserializer.java (working copy)
@@ -28,9 +28,12 @@
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
+import java.util.Properties;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hive.serde2.ColumnProjectionUtils;
import org.apache.hadoop.hive.serde2.SerDeException;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StandardListObjectInspector;
@@ -500,4 +503,117 @@
assertEquals(expected, soi.getPrimitiveJavaObject(rowElement));
}
}
+
+ @Test
+ public void canDeserializeColumnsSelectively() throws SerDeException, IOException {
+ String LOCALRECORD_SCHEMA = "{\n" +
+ " \"namespace\": \"test.avro.deserializer\",\n" +
+ " \"name\": \"oneRecord\",\n" +
+ " \"type\": \"record\",\n" +
+ " \"fields\": [\n" +
+ " {\n" +
+ " \"name\":\"string1\",\n" +
+ " \"type\":\"string\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"name\":\"string2\",\n" +
+ " \"type\":\"string\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"name\":\"int1\",\n" +
+ " \"type\":\"int\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"name\":\"aRecord\",\n" +
+ " \"type\":{\"type\":\"record\",\n" +
+ " \"name\":\"recordWithinARecord\",\n" +
+ " \"fields\": [\n" +
+ " {\n" +
+ " \"name\":\"int1\",\n" +
+ " \"type\":\"int\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"name\":\"boolean1\",\n" +
+ " \"type\":\"boolean\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"name\":\"long1\",\n" +
+ " \"type\":\"long\"\n" +
+ " }\n" +
+ " ]}\n" +
+ " }\n" +
+ " ]\n" +
+ "}";
+
+ Schema s = Schema.parse(LOCALRECORD_SCHEMA);
+ GenericData.Record record = new GenericData.Record(s);
+
+ record.put("string1", "Wandered Aimlessly");
+ record.put("string2", "as a cloud");
+ record.put("int1", 555);
+
+ GenericData.Record innerRecord = new GenericData.Record(s.getField("aRecord").schema());
+ innerRecord.put("int1", 42);
+ innerRecord.put("boolean1", true);
+ innerRecord.put("long1", 42432234234l);
+ record.put("aRecord", innerRecord);
+
+ assertTrue(GENERIC_DATA.validate(s, record));
+
+ AvroGenericRecordWritable garw = Utils.serializeAndDeserializeRecord(record);
+
+ AvroObjectInspectorGenerator aoig = new AvroObjectInspectorGenerator(s);
+
+ AvroSerDe des = new AvroSerDe();
+ Configuration hconf = new Configuration();
+ Properties props = new Properties();
+ props.put(AvroSerdeUtils.SCHEMA_LITERAL, LOCALRECORD_SCHEMA);
+
+ ArrayList queryCols = new ArrayList();
+ queryCols.add(3);
+ queryCols.add(1);
+ queryCols.add(1);
+ queryCols.add(3);
+ queryCols.add(1);
+ ColumnProjectionUtils.appendReadColumnIDs(hconf, queryCols);
+
+
+ // Initialize deserializer
+ des.initialize(hconf, props);
+
+ ArrayList