UDF函数可以直接应用于select语句,对查询结构做格式化处理输出内容。自定义UDF需要继承org.apache.hadoop.hive.ql.UDF,实现evaluate函数。
实例:使用UDF实现自定义生日转年龄的函数。
实现步骤如下:
1.在pom.xml中添加依赖
<properties>
...
<hive.version>3.1.3</hive.version>
<hadoop.version>3.1.3</hadoop.version>
</properties>
<dependencies>
...
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>${hive.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
2.创建自定义函数实现类
package com.example.hivedemo.udf;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.util.Calendar;
public class Birthday2Age extends UDF {
public int evaluate(String birth) {
if (StringUtils.isEmpty(birth)) return -1;
//1.输入年月日
String[] ymd = birth.split("-");
int year = Integer.parseInt(ymd[0]);
int month = Integer.parseInt(ymd[1]);
int day = Integer.parseInt(ymd[2]);
//2.当前的日期
Calendar calendar = Calendar.getInstance();
int currentYear = calendar.get(Calendar.YEAR);
int currentMonth = calendar.get(Calendar.MONTH);
int currentDay = calendar.get(Calendar.DAY_OF_MONTH);
//3.计算年龄
int age = currentYear - year;
if (currentMonth < month) age = age - 1;
else if (currentMonth == month && currentDay < day) age = age - 1;
return age;
}
}
3.打成jar包上传
hdfs dfs -put /root/test/hivedemo.jar /commons/jars/
如果是maven项目打包时出现以下异常:
maven thread "main" java.lang.StackOverflowError
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:481)
给maven添加参数即可。

4.创建自定义函数
create function my_birth2age as 'com.example.hivedemo.udf.Birthday2Age' using jar 'hdfs://hadoop-master:9000/commons/jars/hivedemo.jar'
5.测试自定义函数
hive> select my_birth2age('2017-06-25');
OK
5
Time taken: 0.173 seconds, Fetched: 1 row(s)
注意:hive的show functions命令不能显示出来自定义的函数,但是原数据的funcs表里面可以查看到。