在hive中,有时候一些内置的函数,和普通的查询操作已经满足不了我们要查询的要求,这时候可以自己写一些自定义函数来处理。自定义函数(user defined function =UDF)
由于hive本身是用java语言开发,所以udf必须用java来写才可以。
Hive中有三种UDF
-
普通udf(UDF)
操作单个数据行,且产生一个数据作为输出。例如(数学函数,字符串函数) -
聚合udf (UDAF)
接受多个数据行,并产生一个数据行作为输出。例如(COUNT,MAX函数等) -
表生成UDF(UDTF)
接受一个数据行,然后返回产生多个数据行(一个表作为输出)。比如lateral view(据说是一个将行转成列的函数)。
编写UDF必须满足一下:
- 必须是org.apache.hadoop.hive.ql.exec.UDF的子类
- 必须实现evaluate函数。
下面展示如何编写一个普通的UDF
1、编写类,继承UDF类,重写evaluate方法
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.hadoop.hive.ql.exec.UDF;
public class TimeDiff extends UDF {
public String evaluate(String endTime, String startTime, String format) {
SimpleDateFormat dfs = new SimpleDateFormat(format);
long diff = 0;
Date end = null;
Date start = null;
try {
end = dfs.parse(endTime);
start = dfs.parse(startTime);
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
diff = (end.getTime() - start.getTime());
return Long.toString(diff);
}
public String evaluate(String endTime, String startTime) {
String format = "yyyyMMdd";
return evaluate(endTime, startTime, format);
}
}
2、 打包后上传到客户端所在的目录
3、使用该函数前,需要执行以下两行命令:
ADD JAR /home/hadoop/hive/hive-udf.jar;
CREATE TEMPORARY FUNCTION time_diff AS 'cn.splus.hiveudf.dateutil.TimeDiff';
4、在sql中使用该函数
select year, time_diff(date1, date2) from table;