2017-08-07 61 views
0

我在配置单元中创建了一个UDAF,它将返回列中的第一个重复数字。hive:NoMatchingMethodException没有类的匹配方法

表:firstrepeatingnumber,柱:INDATA,数据:

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 GetFirstReNumber(indata) as ans from firstrepeatingnumber; 

它给错误:

FAILED: NoMatchingMethodException No matching method for class practise.FirstRepeatingNumber with (int). Possible choices:

对于这个UDAF预期的答案是55这个数据集。我无法理解为什么它在执行该功能时发生错误。

回答

-1

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

相关问题