hive的自定义函数包括UDF,UDAF,UDTF三种类型
1、UDF是单行函数
自定义时需要继承UDF类,然后实现evaluate方法即可
代码例子:
package test;
import java.util.ArrayList;
import org.apache.hadoop.hive.ql.exec.UDF;
public class ConnStr2 extends UDF{
//输入两个数组,输出两个数组的对应位置的拼接,要求输入数组长度一致
//例如:(['a','b','c'],[1,2,3]) -->['a-1','b-2','c-3']
public ArrayList<String> evaluate(ArrayList<String> f1,ArrayList<String> f2) {
ArrayList<String> re = new ArrayList<>();
for(int i=0;i<f1.size();i++){
String rr = f1.get(i)+'-'+f2.get(i);
re.add(rr);
}
return re;
}
}
打成 jar 包上传到服务器
将 jar 包添加到 hive 的
classpathhive>add JAR /home/hadoop/hivejar/udf.jar;
查看加入的 jar 的命令:hive> list jar;
创建临时函数与开发好的 class 关联起来
hive>create temporary function connstr as 'test.Connstr2';
至此,便可以在 hql 在使用自定义的函数
select connstr(name),age from student2、UDAF,是聚合函数:
需要实现类AbstractGernericUDAFResolver,然后内部类实现GenericUDAFEvaluator
详细原理参考:https://blog.csdn.net/kent7306/article/details/50110067
仿照原理编写代码,实现统计不同列中字符长度最大值:
package test;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFAverage.AbstractGenericUDAFAverageEvaluator;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator.Mode;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFParameterInfo;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory.ObjectInspectorOptions;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
import org.apache.hadoop.io.IntWritable;
//求一列字符最大长度
public class Max_udaf extends AbstractGenericUDAFResolver{
@Override
public GenericUDAFEvaluator getEvaluator(TypeInfo[] info) throws Semantic