1、Hive 自带了一些函数,比如:max/min 等,但是数量有限,自己可以通过自定义 UDF 来方便的扩展。
2、当 Hive 提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义。
3、根据用户自定义函数类别分为以下三种:
这里的一是代表一行数据
①UDF(User-Defined-Function) 一进一出
②UDAF(User-Defined Aggregation Function) 聚集函数,多进一出 类似于:count/max/min
③UDTF(User-Defined Table-Generating Functions) 一进多出 如 lateral view explore()
4、官方文档地址
https://cwiki.apache.org/confluence/display/Hive/HivePlugins
5、步骤
①继承 org.apache.hadoop.hive.ql.UDF
②需要实现 evaluate 函数;evaluate 函数支持重载;
③将工程打包放到Linux,在 hive 的命令行窗口创建函数 添加 jar
add jar linux_jar_path
④ 创建 function
create [temporary] function [dbname.]function_name AS class_name;
这里temporary表示创建临时function,一旦关闭hive交互界面,就会没有,不加代表永久创建。
⑤在 hive 的命令行窗口删除函数
drop function functionname;
6、注意事项
UDF 必须要有返回类型,可以返回 null,但是返回类型不能为 void;
自定义一个UDF函数
创建工程添加依赖
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>
创建一个类
package com.fengrui;
import org.apache.hadoop.hive.ql.exec.UDF;
public class MyUDF extends UDF {
public int evaluate (int data) {
return data + 5;
}
}
打成jar上传到服务器 /root/Jar_File/myhive/hive-1.0-SNAPSHOT.jar
将jar包添加到hive的classpath
hive (default)> add jar /root/Jar_File/myhive/hive-1.0-SNAPSHOT.jar;
创建临时函数与开发好的Javaclass关联
hive (default)> create temporary function add as 'com.fengrui.MyUDF';
测试
hive (default)> select *,add(id) res from join1;
join1.id join1.name join1.sex join1.addr res
1 zhangsan man beijing 6
2 lisi woman tianjin 7
3 wangwu man shanghai 8
4 AJ woman beijing 9
5 jige man huhehaote 10
6 fengrui man baotou 11