Hi,

I am writing a UDAF which takes in 4 parameters. I have 2 cases - one where
all the paramters are ints, and second where the last parameter is double. I
wrote two evaluators for this, with iterate as

public boolean iterate(int max, int groupBy, int attribute, int count)

and

public boolean iterate(int max, int groupBy, int attribute, double count)

However, when I run a query, I get the exception:
org.apache.hadoop.hive.ql.exec.AmbiguousMethodException: Ambiguous method
for class org.apache.hadoop.hive.udaf.TopXPerGroup with [int, int, int, int]
        at
org.apache.hadoop.hive.ql.exec.DefaultUDAFEvaluatorResolver.getEvaluatorClass(DefaultUDAFEvaluatorResolver.java:83)
        at
org.apache.hadoop.hive.ql.udf.generic.GenericUDAFBridge.getEvaluator(GenericUDAFBridge.java:57)
        at
org.apache.hadoop.hive.ql.exec.FunctionRegistry.getGenericUDAFEvaluator(FunctionRegistry.java:594)
        at
org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.getGenericUDAFEvaluator(SemanticAnalyzer.java:1882)
        at
org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genGroupByPlanMapGroupByOperator(SemanticAnalyzer.java:2270)
        at
org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genGroupByPlanMapAggr1MR(SemanticAnalyzer.java:2821)
        at
org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genBodyPlan(SemanticAnalyzer.java:4543)
        at
org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genPlan(SemanticAnalyzer.java:5058)
        at
org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genPlan(SemanticAnalyzer.java:4999)
        at
org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genPlan(SemanticAnalyzer.java:5020)
        at
org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genPlan(SemanticAnalyzer.java:4999)
        at
org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genPlan(SemanticAnalyzer.java:5020)
        at
org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.analyzeInternal(SemanticAnalyzer.java:5587)
        at
org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.analyze(BaseSemanticAnalyzer.java:114)
        at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:317)
        at org.apache.hadoop.hive.ql.Driver.runCommand(Driver.java:370)
        at org.apache.hadoop.hive.ql.Driver.run(Driver.java:362)
        at
org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:140)
        at
org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:200)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:311)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:156)

One option for me is to write  a resolver which I will do. But, I just
wanted to know if this is a bug in hive whereby it is not able to get the
write evaluator. Or if this is a gap in my understanding.

I look forward to hearing your views on this.

Thanks and Regards,
Sonal

Reply via email to