hive:NoMatchingMethodException没有类的匹配方法

时间:2017-08-07 05:20:16

标签: java hadoop hive user-defined-functions bigdata

我在配置单元中创建了一个UDAF,它将返回列中的第一个重复数字。

表:firstrepeatingnumber,Column:indata,data:

55
125
1561234
123
12
1
-123
321
124
55
123
15236
32
125
44

UDAF:practise.FirstRepeatingNumber

UDAF:

package practise;
import java.util.ArrayList;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
@SuppressWarnings("deprecation")
public class FirstRepeatingNumber extends UDAF{
    class firstRepeatingNumberUDAFEvaluator implements UDAFEvaluator{
        int len=0,number=0,index=0,i=0,j=0,arrLength=0,set=0,ans=0;
        ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> arr2 = new ArrayList<Integer>();
        @Override
        public void init() {
            for(i=0;i<10;i++)
                arr.add(new ArrayList<Integer>());
        }
        public boolean iterate(int value){
            if(set==1)
                return true;
            index=value%10;
            try{arrLength=arr.get(index).size();}
            catch(Exception ex){}
            for(j=0;j<arrLength;j++){
                if(value==arr.get(index).get(j)){
                    ans=value;
                    set=1;
                    return true;
                }
            }
            if(set==0)
            {
                try{
                    arr2=arr.get(index);
                }
                catch(Exception ex){
                }
                arr2.add(value);
                arr.set(index, arr2);
            }
            return true;
        }
        public int terminate(){
            return ans;
        }
    }
}

这是函数创建:

create function GetFirstReNumber AS 'practise.FirstRepeatingNumber';

当我运行select query时:

select GetFirstReNumber(indata) as ans from firstrepeatingnumber;

它给出错误:

  

FAILED: NoMatchingMethodException 没有与(int)类实现.firstRepeatingNumber的匹配方法。可能的选择:

对于此UDAF,此数据集的预期答案为55。我无法理解为什么在执行函数时会出错。

2 个答案:

答案 0 :(得分:0)

请按照以下步骤操作:

1。重新启动配置单元

2.DROP FUNCTION xxx

3.CREATE FUNCTION XXX

4.run ...

答案 1 :(得分:-1)

您应该检查列“indata”的数据类型,该列应为int。  奇怪的是,我没有看到函数terminatePartial()merge()

的实现