diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/UDTFOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/UDTFOperator.java index a7759fc..afd7bcf 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/UDTFOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/UDTFOperator.java @@ -44,7 +44,7 @@ protected final Log LOG = LogFactory.getLog(this.getClass().getName()); - ObjectInspector[] udtfInputOIs = null; + StructObjectInspector udtfInputOI = null; Object[] objToSendToUDTF = null; GenericUDTF genericUDTF; @@ -63,22 +63,16 @@ protected void initializeOp(Configuration hconf) throws HiveException { genericUDTF.setCollector(collector); - // Make an object inspector [] of the arguments to the UDTF - List inputFields = - ((StructObjectInspector) inputObjInspectors[0]).getAllStructFieldRefs(); + udtfInputOI = (StructObjectInspector) inputObjInspectors[0]; - udtfInputOIs = new ObjectInspector[inputFields.size()]; - for (int i = 0; i < inputFields.size(); i++) { - udtfInputOIs[i] = inputFields.get(i).getFieldObjectInspector(); - } - objToSendToUDTF = new Object[inputFields.size()]; + objToSendToUDTF = new Object[udtfInputOI.getAllStructFieldRefs().size()]; MapredContext context = MapredContext.get(); if (context != null) { context.setup(genericUDTF); } - StructObjectInspector udtfOutputOI = genericUDTF.initialize( - udtfInputOIs); + StructObjectInspector udtfOutputOI = genericUDTF.initialize(udtfInputOI); + if (conf.isOuterLV()) { outerObj = Arrays.asList(new Object[udtfOutputOI.getAllStructFieldRefs().size()]); } diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 5305537..09a6b09 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -20,6 +20,7 @@ import java.io.Serializable; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -166,6 +167,8 @@ import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; +import org.apache.hadoop.hive.serde2.objectinspector.StandardStructObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.StructField; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; @@ -5705,7 +5708,9 @@ private Operator genUDTFPlan(GenericUDTF genericUDTF, colNames.add(inputCols.get(i).getInternalName()); colOIs[i] = inputCols.get(i).getObjectInspector(); } - StructObjectInspector outputOI = genericUDTF.initialize(colOIs); + StandardStructObjectInspector rowOI = + ObjectInspectorFactory.getStandardStructObjectInspector(colNames, Arrays.asList(colOIs)); + StructObjectInspector outputOI = genericUDTF.initialize(rowOI); int numUdtfCols = outputOI.getAllStructFieldRefs().size(); if (colAliases.isEmpty()) { diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDTF.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDTF.java index 9956f4e..a93a264 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDTF.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDTF.java @@ -18,10 +18,13 @@ package org.apache.hadoop.hive.ql.udf.generic; +import java.util.List; + import org.apache.hadoop.hive.ql.exec.MapredContext; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.StructField; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; /** @@ -43,6 +46,16 @@ public void configure(MapredContext mapredContext) { } + public StructObjectInspector initialize(StructObjectInspector argOIs) + throws UDFArgumentException { + List inputFields = argOIs.getAllStructFieldRefs(); + ObjectInspector[] udtfInputOIs = new ObjectInspector[inputFields.size()]; + for (int i = 0; i < inputFields.size(); i++) { + udtfInputOIs[i] = inputFields.get(i).getFieldObjectInspector(); + } + return initialize(udtfInputOIs); + } + /** * Initialize this GenericUDTF. This will be called only once per instance. * @@ -53,8 +66,11 @@ public void configure(MapredContext mapredContext) { * field names are unimportant as they will be overridden by user * supplied column aliases. */ - public abstract StructObjectInspector initialize(ObjectInspector[] argOIs) - throws UDFArgumentException; + @Deprecated + public StructObjectInspector initialize(ObjectInspector[] argOIs) + throws UDFArgumentException { + throw new IllegalStateException("Should not be called directly"); + } /** * Give a set of arguments for the UDTF to process.