Index: serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorConverters.java =================================================================== --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorConverters.java (revision 1519807) +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorConverters.java (working copy) @@ -25,16 +25,16 @@ import org.apache.hadoop.hive.serde2.objectinspector.primitive.JavaStringObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorConverter; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; -import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableHiveDecimalObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableBinaryObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableBooleanObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableByteObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableDateObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableDoubleObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableFloatObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableHiveDecimalObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableIntObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableLongObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableShortObjectInspector; -import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableDateObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableTimestampObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.VoidObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableStringObjectInspector; @@ -136,6 +136,7 @@ if (inputOI.equals(outputOI)) { return new IdentityConverter(); } + // TODO: Add support for UNION once SettableUnionObjectInspector is implemented. switch (outputOI.getCategory()) { case PRIMITIVE: return getConverter((PrimitiveObjectInspector) inputOI, (PrimitiveObjectInspector) outputOI); @@ -155,29 +156,6 @@ } } - // Return the settable equivalent object inspector for primitive categories - // For eg: for table T containing partitions p1 and p2 (possibly different - // from the table T), return the settable inspector for T. The inspector for - // T is settable recursively i.e all the nested fields are also settable. - private static ObjectInspector getSettableConvertedOI( - ObjectInspector inputOI) { - switch (inputOI.getCategory()) { - case PRIMITIVE: - PrimitiveObjectInspector primInputOI = (PrimitiveObjectInspector) inputOI; - return PrimitiveObjectInspectorFactory. - getPrimitiveWritableObjectInspector(primInputOI.getPrimitiveCategory()); - case STRUCT: - return inputOI; - case LIST: - return inputOI; - case MAP: - return inputOI; - default: - throw new RuntimeException("Hive internal error: desired OI of " - + inputOI.getTypeName() + " not supported yet."); - } - } - public static ObjectInspector getConvertedOI( ObjectInspector inputOI, ObjectInspector outputOI) { @@ -185,9 +163,16 @@ if (inputOI.equals(outputOI)) { return outputOI; } + // Return the settable equivalent object inspector for primitive categories + // For eg: for table T containing partitions p1 and p2 (possibly different + // from the table T), return the settable inspector for T. The inspector for + // T is settable recursively i.e all the nested fields are also settable. + // TODO: Add support for UNION once SettableUnionObjectInspector is implemented. switch (outputOI.getCategory()) { case PRIMITIVE: - return outputOI; + PrimitiveObjectInspector primInputOI = (PrimitiveObjectInspector) inputOI; + return PrimitiveObjectInspectorFactory. + getPrimitiveWritableObjectInspector(primInputOI.getPrimitiveCategory()); case STRUCT: StructObjectInspector structOutputOI = (StructObjectInspector) outputOI; if (structOutputOI.isSettable()) { @@ -202,20 +187,22 @@ for (StructField listField : listFields) { structFieldNames.add(listField.getFieldName()); - structFieldObjectInspectors.add( - getSettableConvertedOI(listField.getFieldObjectInspector())); + structFieldObjectInspectors.add(getConvertedOI(listField.getFieldObjectInspector(), + null)); } - StandardStructObjectInspector structStandardOutputOI = ObjectInspectorFactory - .getStandardStructObjectInspector( + return ObjectInspectorFactory.getStandardStructObjectInspector( structFieldNames, structFieldObjectInspectors); - return structStandardOutputOI; } case LIST: - return outputOI; + ListObjectInspector listOutputOI = (ListObjectInspector) outputOI; + return ObjectInspectorFactory.getStandardListObjectInspector( + listOutputOI.getListElementObjectInspector()); case MAP: - return outputOI; + MapObjectInspector mapOutputOI = (MapObjectInspector) outputOI; + return ObjectInspectorFactory.getStandardMapObjectInspector( + mapOutputOI.getMapKeyObjectInspector(), mapOutputOI.getMapValueObjectInspector()); default: throw new RuntimeException("Hive internal error: conversion of " + inputOI.getTypeName() + " to " + outputOI.getTypeName()