2017-08-07 473 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()

相關問題