背景
Hive 有丰富的内置函数,方便数据处理和数据分析。但是有些时候无法满足需求,这时就需要自定义函数(User-Defined Functions , UDF)来扩展 Hive 函数库,实现用户想要的功能。
UDF 开发
编写 UDF 函数需要下面两个步骤:
- 继承 org.apache.hadoop.hive.ql.exec.UDF
- 实现 evaluate 函数,这个函数必须要有返回值,不能设置为void。
样例:
1、导入依赖
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies>
2、继承udf,实现 evaluate 函数
import org.apache.hadoop.hive.ql.exec.UDF;
// hive的自定义函数
public class MyUDF extends UDF {
// evaluate 方法可以重载
public int evaluate(int a, int b) {
return a + b;//计算两个数之和
}
}
3、udf函数部署 4、使用udf函数
hive> select my_udf(1,2) from xxx;
查询结果返回 3
UDF 部署方式
官方提供了两种部署 UDF 的方式:
- 临时部署(Temporary Functions)
- 永久部署(Permanent Functions)
两者的区别在于:
- 临时部署的方式,只会在当前 Session 下有效并可用。
- 永久部署的方式,在部署成功后任何一个 Hive 客户端(重新启动的 Hive 客户端,已经启动的客户端需要重新加载)都可以使用。
1、临时部署
hive> add jar /path/xxx/myudf.jar;
hive> create temporary function my_udf as 'xxx.xxx.MyUDF';
建议函数名使用 下划线命名法(全部小写字母)。
2、永久部署
这种方式是 hive-0.13 版本以后开始支持的注册方法;
hive> create function udf.my_udf as 'xxx.xxx.MyUDF' using jar 'hdfs://path/xxx/myudf.jar';
需要注意的是:函数名称前面一定要带上数据库名称。
这种方法的优点为全局可见,一次添加完成即可永久使用。支持数据库级别的函数名称。之所以能够永久性的部署,是因为hive将函数的数据存储到了数据库表 FUNCS 和 FUNC_RU中。
部署步骤
1、登陆hive所在的跳板机
2、切换用户名: sudo su hadoop
3、上传jar包到机器: rs
4、jar包上传到HDFS目录下:
hadoop fs -ls /hive/udf
hadoop fs -put xxx.jar /hive/udf
5、可以设置运行队列(选做):
set mapreduce.job.queuename=root.data.xxx;
6、hive环境下发布udf函数:
hive> create function udf.my_udf as 'xxx.xxx.MyUDF' using jar 'hdfs://hive/udf/xxx.jar';
hdfs基本命令:https://hadoop.apache.org/docs/r1.0.4/cn/commands_manual.html
函数相关的语句
查看所有函数(内置函数+自定义函数)
show functions;
查看某个函数的使用说明
describe functions 函数名;
创建临时自定义函数
create temporary function 函数名 as '类路径';
删除临时自定义函数
drop temporary function [if exists] 函数名;
创建永久自定义函数
create function [库名.]函数名 as '类路径' using jar 'jar包路径';
删除永久自定义函数
drop function [if exists] 函数名;
重载函数
reload function;