[ https://issues.apache.org/jira/browse/HIVE-12719?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Surbhit updated HIVE-12719: --------------------------- Release Note: I am facing an issues while calling custom generic UDAF's in HIVE (1.2.1). Below is my implementation for GenericUDAF : - /** * */ package com.practice.hive.udaf.test; import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.parse.SemanticException; import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator; import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFParameterInfo; import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFResolver2; import org.apache.hadoop.hive.ql.util.JavaDataModel; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.LongObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; import org.apache.hadoop.io.LongWritable; /** * @author surbhit.shrivastava * */ public class GenericUDAFRegrCount implements GenericUDAFResolver2 { // This is deprecated will not be called .. but is present for backward compatibility purpose @Override public GenericUDAFEvaluator getEvaluator(TypeInfo[] parameters) throws SemanticException { if (parameters.length != 2) { throw new UDFArgumentTypeException(parameters.length - 1, "Exactly two arguments are expected."); } return new GenericUDAFRegrCountEvaluator(); } @Override public GenericUDAFEvaluator getEvaluator(GenericUDAFParameterInfo paramInfo) throws SemanticException { TypeInfo[] parameters = paramInfo.getParameters(); if (parameters.length != 2) { throw new UDFArgumentTypeException(parameters.length - 1, "Exactly two arguments are expected."); } if (paramInfo.isAllColumns()) { throw new UDFArgumentTypeException(parameters.length - 1, "* is not supported"); } if (paramInfo.isDistinct()) { throw new UDFArgumentTypeException(parameters.length - 1, "DISTINCT keyword is not allowed"); } return new GenericUDAFRegrCountEvaluator(); } public static class GenericUDAFRegrCountEvaluator extends GenericUDAFEvaluator { private LongObjectInspector partialCountAggOI; private LongWritable result; @Override public ObjectInspector init(Mode m, ObjectInspector[] parameters) throws HiveException { super.init(m, parameters); if (m == Mode.PARTIAL2 || m == Mode.FINAL) { partialCountAggOI = (LongObjectInspector) parameters[0]; } result = new LongWritable(0); return PrimitiveObjectInspectorFactory.writableLongObjectInspector; } /** class for storing count value. */ @AggregationType(estimable = true) static class CountAgg extends AbstractAggregationBuffer { long value; @Override public int estimate() { return JavaDataModel.PRIMITIVES2; } } @Override public AggregationBuffer getNewAggregationBuffer() throws HiveException { CountAgg buffer = new CountAgg(); reset(buffer); return buffer; } @Override public void reset(AggregationBuffer agg) throws HiveException { ((CountAgg) agg).value = 0; } @Override public void iterate(AggregationBuffer agg, Object[] parameters) throws HiveException { if (parameters == null) { return; } if (null != parameters[0] && null != parameters[1]) { ((CountAgg) agg).value++; } } @Override public void merge(AggregationBuffer agg, Object partial) throws HiveException { if (partial != null) { long p = partialCountAggOI.get(partial); ((CountAgg) agg).value += p; } } @Override public Object terminate(AggregationBuffer agg) throws HiveException { result.set(((CountAgg) agg).value); return result; } @Override public Object terminatePartial(AggregationBuffer agg) throws HiveException { return terminate(agg); } } } I have registered the function using - CREATE FUNCTION REGR_COUNT AS 'com.practice.hive.udaf.test.GenericUDAFRegrCount' USING JAR 'hdfs:///data/test/hadoop-sample-0.1-SNAPSHOT.jar'; I get the below errors while trying to execute query - select regr_count(empid,depid) over() from EMPLOYEE; FAILED: SemanticException Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns. Also check for circular dependencies. Underlying error: Invalid function regr_count Although the same function works fine when registered as temporary function using . CREATE TEMPORARY FUNCTION REGR_COUNT AS 'com.practice.hive.udaf.test.GenericUDAFRegrCount' USING JAR 'hdfs:///data/test/hadoop-sample-0.1-SNAPSHOT.jar'; Any help would be highly appreciated :) was: I am facing an issues while calling custom generic UDAF's in HIVE (1.2.1). Below is my implementation for GenericUDAF : - {code} /** * */ package com.practice.hive.udaf.test; import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.parse.SemanticException; import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator; import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFParameterInfo; import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFResolver2; import org.apache.hadoop.hive.ql.util.JavaDataModel; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.LongObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; import org.apache.hadoop.io.LongWritable; /** * @author surbhit.shrivastava * */ public class GenericUDAFRegrCount implements GenericUDAFResolver2 { // This is deprecated will not be called .. but is present for backward compatibility purpose @Override public GenericUDAFEvaluator getEvaluator(TypeInfo[] parameters) throws SemanticException { if (parameters.length != 2) { throw new UDFArgumentTypeException(parameters.length - 1, "Exactly two arguments are expected."); } return new GenericUDAFRegrCountEvaluator(); } @Override public GenericUDAFEvaluator getEvaluator(GenericUDAFParameterInfo paramInfo) throws SemanticException { TypeInfo[] parameters = paramInfo.getParameters(); if (parameters.length != 2) { throw new UDFArgumentTypeException(parameters.length - 1, "Exactly two arguments are expected."); } if (paramInfo.isAllColumns()) { throw new UDFArgumentTypeException(parameters.length - 1, "* is not supported"); } if (paramInfo.isDistinct()) { throw new UDFArgumentTypeException(parameters.length - 1, "DISTINCT keyword is not allowed"); } return new GenericUDAFRegrCountEvaluator(); } public static class GenericUDAFRegrCountEvaluator extends GenericUDAFEvaluator { private LongObjectInspector partialCountAggOI; private LongWritable result; @Override public ObjectInspector init(Mode m, ObjectInspector[] parameters) throws HiveException { super.init(m, parameters); if (m == Mode.PARTIAL2 || m == Mode.FINAL) { partialCountAggOI = (LongObjectInspector) parameters[0]; } result = new LongWritable(0); return PrimitiveObjectInspectorFactory.writableLongObjectInspector; } /** class for storing count value. */ @AggregationType(estimable = true) static class CountAgg extends AbstractAggregationBuffer { long value; @Override public int estimate() { return JavaDataModel.PRIMITIVES2; } } @Override public AggregationBuffer getNewAggregationBuffer() throws HiveException { CountAgg buffer = new CountAgg(); reset(buffer); return buffer; } @Override public void reset(AggregationBuffer agg) throws HiveException { ((CountAgg) agg).value = 0; } @Override public void iterate(AggregationBuffer agg, Object[] parameters) throws HiveException { if (parameters == null) { return; } if (null != parameters[0] && null != parameters[1]) { ((CountAgg) agg).value++; } } @Override public void merge(AggregationBuffer agg, Object partial) throws HiveException { if (partial != null) { long p = partialCountAggOI.get(partial); ((CountAgg) agg).value += p; } } @Override public Object terminate(AggregationBuffer agg) throws HiveException { result.set(((CountAgg) agg).value); return result; } @Override public Object terminatePartial(AggregationBuffer agg) throws HiveException { return terminate(agg); } } } {code} I have registered the function using - CREATE FUNCTION REGR_COUNT AS 'com.practice.hive.udaf.test.GenericUDAFRegrCount' USING JAR 'hdfs:///data/test/hadoop-sample-0.1-SNAPSHOT.jar'; I get the below errors while trying to execute query - select regr_count(empid,depid) over() from EMPLOYEE; FAILED: SemanticException Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns. Also check for circular dependencies. Underlying error: Invalid function regr_count Although the same function works fine when registered as temporary function using . CREATE TEMPORARY FUNCTION REGR_COUNT AS 'com.practice.hive.udaf.test.GenericUDAFRegrCount' USING JAR 'hdfs:///data/test/hadoop-sample-0.1-SNAPSHOT.jar'; Any help would be highly appreciated :) > As a hive user, I am facing issues using permanent UDAF's. > ---------------------------------------------------------- > > Key: HIVE-12719 > URL: https://issues.apache.org/jira/browse/HIVE-12719 > Project: Hive > Issue Type: Bug > Components: Hive > Affects Versions: 1.2.1 > Reporter: Surbhit > -- This message was sent by Atlassian JIRA (v6.3.4#6332)