2017-08-07 2 views
0

J'ai créé un UDAF dans la ruche qui renverra le premier nombre récurrent dans la colonne.hive: NoMatchingMethodException Aucune méthode correspondante pour la classe

Tableau: firstrepeatingnumber, Colonne: InData, données:

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; 
     } 
    } 
} 

est la création de la fonction ici:

create function GetFirstReNumber AS 'practise.FirstRepeatingNumber'; 

Quand je lance la requête de sélection:

select GetFirstReNumber(indata) as ans from firstrepeatingnumber; 

il donne l'erreur:

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

Pour cette UDAF la réponse attendue est de 55 sur cet ensemble de données. Je suis incapable de comprendre pourquoi donne-t-il une erreur lors de l'exécution de la fonction.

Répondre

-1

Vous devez vérifier le type de données de la colonne "indata", qui doit être int. Et il est étrange que je ne vois pas la mise en œuvre de la fonction terminatePartial() et merge()