@TOChive udaf
自定义函数
hive支持用户自定义函数,主要有三种。UDF、UDAF和UDTF。
UDF(User-Defined-Function)。输入一个或者多个参数,返回一个值。对一行或者一条数据操作。例如求长度length().
UDAF(User- Defined Aggregation Funcation)。聚合函数,多进一出,对于多条数据进行聚合操作。例如max(),min(),count()。多行转成一行。
UDTF(User-Defined Table-Generating Functions)。一进多出,可以对一行数据转成多行。
udf通常来说比较简单,但是用的也最多。这里只聚一个简单的例子.重点讨论UDAF的实现。
//写一个函数判断输入的字符串是否为空
import org.apache.hadoop.hive.ql.exec.UDF;
public class is_null extends UDF {
public static int evaluate(String str){
if (str == null || str.equals("") || str.replaceAll("\\s","").length()<=0){
return 0;
}else {
return 1;
}
}
}
编写简单类型的UDF只需要注意两点即可
1).继承org.apache.hadoop.hive.ql.exec.UDF
2).实现evaluate方法。
然后把程序打包放到hive服务器上。
hive>add jar /data1/is_null.jar;
hive>create temporary function is_null as 'com.shaohua.udf.is_null';
hive>select is_null(column) from table1;
UDAF
UDAF需要继承的类
1).org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
2).org.apache.hadoop.hive.ql.exec.UDAF;
UDAF需要实现的方法
a).init()用于udaf的初始化。
b).iterate().接收输入的参数,进行内部轮转,返回boolean。
c).terminatePartial():无参数,其为iterate函数轮转结束后,返回轮转数据,类似于hadoop的Combiner
d).merge():接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean
e).terminate():返回最终的聚集函数结果.
首先举一个常用的例子,求平均值。
import or