当HIVE的内置函数不能满足需求时,可以通过编写用户自定义函数UDF(User-Defined Functions)插入自己的处理代码并在查询中使用它们。
HIVE中由三种UDF:
1、普通的UDF,用于操作单个数据行,且产生一个数据行作为输出。
2、用户定义聚集函数UDAF(User-Defined Aggregating Functions),用于接受多个输入数据行,并产生一个输出数据行。
3、用户定义表生成函数UDTF(User-Defined Table-Generation Functions),用于操作单个输入行,产生多个输出行。
说明:
● 一个UDF必须继承自“org.apache.hadoop.hive.ql.exec.UDF”。
● 一个UDF必须至少实现一个evaluate()方法,evaluate函数支持重载。
● 编写HIVE UDF,可以extends UDF,重写evaluate()方法;也可以extends GenericUDF,重写initialize()、getDisplayString()、evaluate()方法。
编写UDF样例代码:
package com.hadoop.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class UDFTest extends UDF {
public String evaluate(String str) {
try {
return "HelloUDF " + str;
} catch (Exception e) {
return null;
}
}
}
使用UDF:
将编写好的代码打成HelloUDF.jar包并上传到指定的hdfs目录下,登陆hive客户端:
在HIVE Server中注册该jar文件,执行SQL语句:add jar HelloUDF.jar;
在HIVE Server中定义该函数,执行SQL语句:create temporary function HelloUDF as 'com.hadoop.hive.udf.UDFTest';
在SELECT查询中使用该函数:select HelloUDF(t.col1) from t limit 1;
在HIVE Server中删除该函数,执行SQL语句:drop temporary function HelloUDF;
注:该方法生成的HelloUDF函数为临时函数,每次进入HIVE都需要执行add以及create temporary操作