我在配置单元中创建了一个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。我无法理解为什么在执行函数时会出错。
答案 0 :(得分:0)
请按照以下步骤操作:
1。重新启动配置单元
2.DROP FUNCTION xxx
3.CREATE FUNCTION XXX
4.run ...
答案 1 :(得分:-1)
您应该检查列“indata”的数据类型,该列应为int
。
奇怪的是,我没有看到函数terminatePartial()
和merge()