diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java index d047b25..81cb6f8 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java @@ -39,7 +39,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.metastore.api.Function; import org.apache.hadoop.hive.metastore.api.MetaException; @@ -1613,10 +1612,6 @@ public static boolean isDeterministic(GenericUDF genericUDF) { // the deterministic annotation declares return false; } - UDFType genericUDFType = AnnotationUtils.getAnnotation(genericUDF.getClass(), UDFType.class); - if (genericUDFType != null && genericUDFType.deterministic() == false) { - return false; - } if (genericUDF instanceof GenericUDFBridge) { GenericUDFBridge bridge = (GenericUDFBridge) (genericUDF); @@ -1626,6 +1621,11 @@ public static boolean isDeterministic(GenericUDF genericUDF) { } } + UDFType genericUDFType = AnnotationUtils.getAnnotation(genericUDF.getClass(), UDFType.class); + if (genericUDFType != null && genericUDFType.deterministic() == false) { + return false; + } + if (genericUDF instanceof GenericUDFMacro) { GenericUDFMacro macro = (GenericUDFMacro) (genericUDF); return macro.isDeterministic(); @@ -1638,11 +1638,6 @@ public static boolean isDeterministic(GenericUDF genericUDF) { * Returns whether a GenericUDF is stateful or not. */ public static boolean isStateful(GenericUDF genericUDF) { - UDFType genericUDFType = AnnotationUtils.getAnnotation(genericUDF.getClass(), UDFType.class); - if (genericUDFType != null && genericUDFType.stateful()) { - return true; - } - if (genericUDF instanceof GenericUDFBridge) { GenericUDFBridge bridge = (GenericUDFBridge) genericUDF; UDFType bridgeUDFType = AnnotationUtils.getAnnotation(bridge.getUdfClass(), UDFType.class); @@ -1651,6 +1646,11 @@ public static boolean isStateful(GenericUDF genericUDF) { } } + UDFType genericUDFType = AnnotationUtils.getAnnotation(genericUDF.getClass(), UDFType.class); + if (genericUDFType != null && genericUDFType.stateful()) { + return true; + } + if (genericUDF instanceof GenericUDFMacro) { GenericUDFMacro macro = (GenericUDFMacro) (genericUDF); return macro.isStateful(); diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java index 155002a..be032bf 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java @@ -2047,7 +2047,7 @@ public static ClassLoader getSessionSpecifiedClassLoader() { } ClassLoader sessionCL = state.getConf().getClassLoader(); if (sessionCL != null){ - LOG.debug("Use session specified class loader"); + LOG.trace("Use session specified class loader"); return sessionCL; } LOG.debug("Session specified class loader not found, use thread based class loader"); diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java index b7a067a..8b2a6b9 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java @@ -33,6 +33,7 @@ import org.apache.hadoop.hive.ql.exec.ColumnInfo; import org.apache.hadoop.hive.ql.exec.FileSinkOperator; import org.apache.hadoop.hive.ql.exec.FilterOperator; +import org.apache.hadoop.hive.ql.exec.FunctionRegistry; import org.apache.hadoop.hive.ql.exec.GroupByOperator; import org.apache.hadoop.hive.ql.exec.JoinOperator; import org.apache.hadoop.hive.ql.exec.Operator; @@ -41,7 +42,6 @@ import org.apache.hadoop.hive.ql.exec.SelectOperator; import org.apache.hadoop.hive.ql.exec.TableScanOperator; import org.apache.hadoop.hive.ql.exec.UDF; -import org.apache.hadoop.hive.ql.exec.Utilities; import org.apache.hadoop.hive.ql.lib.Node; import org.apache.hadoop.hive.ql.lib.NodeProcessor; import org.apache.hadoop.hive.ql.lib.NodeProcessorCtx; @@ -58,10 +58,8 @@ import org.apache.hadoop.hive.ql.plan.GroupByDesc; import org.apache.hadoop.hive.ql.plan.JoinCondDesc; import org.apache.hadoop.hive.ql.plan.JoinDesc; -import org.apache.hadoop.hive.ql.plan.PlanUtils; import org.apache.hadoop.hive.ql.plan.ReduceSinkDesc; import org.apache.hadoop.hive.ql.plan.TableScanDesc; -import org.apache.hadoop.hive.ql.udf.UDFType; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge; @@ -259,11 +257,7 @@ private static ExprNodeDesc foldExpr(ExprNodeDesc desc, Map children, int i) { private static String getName(GenericUDF hiveUDF) { String udfName = null; if (hiveUDF instanceof GenericUDFBridge) { - udfName = ((GenericUDFBridge) hiveUDF).getUdfName(); + udfName = hiveUDF.getUdfName(); } else { - Class udfClass = hiveUDF.getClass(); - Annotation udfAnnotation = udfClass.getAnnotation(Description.class); - - if (udfAnnotation != null && udfAnnotation instanceof Description) { - Description udfDescription = (Description) udfAnnotation; + Class clazz = hiveUDF.getClass(); + Description udfDescription = AnnotationUtils.getAnnotation(clazz, Description.class); + if (udfDescription != null) { udfName = udfDescription.name(); if (udfName != null) { String[] aliases = udfName.split(","); @@ -331,7 +329,7 @@ private static OptiqUDFInfo getUDFInfo(String hiveUdfName, } udfInfo.m_operandTypeChecker = OperandTypes.family(typeFamilyBuilder.build()); - udfInfo.m_argTypes = ImmutableList. copyOf(optiqArgTypes); + udfInfo.m_argTypes = ImmutableList.copyOf(optiqArgTypes); udfInfo.m_retType = optiqRetType; return udfInfo; diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBridge.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBridge.java index e471285..acb9d8c 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBridge.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBridge.java @@ -22,7 +22,6 @@ import java.lang.reflect.Method; import java.util.ArrayList; -import org.apache.hadoop.hive.common.JavaUtils; import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.ql.exec.FunctionRegistry; import org.apache.hadoop.hive.ql.exec.UDF; @@ -127,9 +126,14 @@ public void setOperator(boolean isOperator) { this.isOperator = isOperator; } + public boolean isInitialized() { + return udf != null; + } + public Class getUdfClass() { try { - return (Class) Class.forName(udfClassName, true, Utilities.getSessionSpecifiedClassLoader()); + return (Class) Class.forName(udfClassName, true, + Utilities.getSessionSpecifiedClassLoader()); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } @@ -139,7 +143,7 @@ public void setOperator(boolean isOperator) { public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException { try { - udf = (UDF) Class.forName(udfClassName, true, Utilities.getSessionSpecifiedClassLoader()).newInstance(); + udf = getUdfClass().newInstance(); } catch (Exception e) { throw new UDFArgumentException( "Unable to instantiate UDF implementation class " + udfClassName + ": " + e);