用Java开发自定义函数,步骤:
1.eclipse上新建一个工程project(db2019);
2.导jar依赖包:
db2019右键 --build path --configure...
--add library --user library --new(新建一个library(hive2.3.2_jar))
--add external jars(添加jar包) --认准路径,全选所有包(一般第一个不是)
--点OK --勾选hive2.3.2_jar --Finish --Apply --点OK
3.新建一个包package(com.ghgj.cn.udf):
--右键db2019下的src --new --package --输入name(com.ghgj.cn.udf) --Finish
4.定义一个类class(MyUdf):
--右键com.ghgj.cn.udf --new --class --输入name(MyUdf) --Finish
此时代码自动显示为:
package com.ghgj.cn.udf;
public calss MyUdf{
}
5.继承 UDF 这个类
--下载hive源码包:apache-hive-2.3.2-src.tar.gz
--解压源码包得到:apache-hive-2.3.2-src.tar
--再解压apache-hive-2.3.2-src.tar,得到文件:apache-hive-2.3.2-src
package com.ghgj.cn.udf;
public calss MyUdf extends UDF{
}
--选中UDF,在自动冒出来的所有选择中,选择是hive的(org.apache.hadoop.hive.ql.exec)
关联一下 UDF 和源码包 apache-hive-2.3.2-src:
--点击代码中的UDF --attach source
--选择external location --添加路径(external folder...)
--找到源码包 apache-hive-2.3.2-src --点确定 --点OK(然后等待两者关联)
生成一个UDF.class的类,这个类中告诉我们:
- 新建的MyUdf类必须先继承这个类,即:public calss MyUdf extends UDF{}
- 新建的MyUdf类可以实现一个或多个自定义函数evaluate()
- 自定义函数evaluate()可以被hive调用
6.在eclipse中实现一个或多个自定义函数evaluate()
package com.ghgj.cn.udf; import org.apache.hadoop.hive.ql.exec.UDF; public calss MyUdf extends UDF{ //evaluate()括号中输入需要处理的字段,可以是一个或多个,并需要指定参数类型 //return的结果是什么类型,则evaluate()前就输入什么类型 private int evaluate(int age){ //年龄对3取余 int res = age%3; return res } private int evaluate(int a,int b){ //求和 return a+b } private String evaluate(String ip){ //将IP地址补全为三位数,便于比较 //65.727.2.9 补全为065.727.002.009 int res = age%3; String[] split = ip.split('\\.');#将IP根据.分割开,.需要转义 StringBuffer sb = new StringBuffer();#先创建一个空的StringBuffer类型的串 for(String s:split){ //逻辑:每一个数字前添加至少3个0,然后截取后三位 //65-->00065-->取后三位065 String tmp = '000' + s; #数字前添加0 //截取后3位,并在每个数字后面添加分隔符. sb.append(tmp.substring(tmp.length()-3)).append('.'); //去掉最后一个分隔符. resb = sb.toString().substring(0,sb.length()-1); } return resb } }
测试一下:
public static void main(String[] args) { MyUdf mu = new MyUdf(); System.out.printIn(mu.evaluate(5)); #测试第1个,5%3=2,输出2 System.out.printIn(mu.evaluate(5,3)); #测试第2个,5+3=8,输出8 System.out.printIn(mu.evaluate('65.727.2.9')); #测试第3个,输出065.727.002.009 }
hive上添加自定义函数,步骤:
1.打jar包
--右键com.ghgj.cn.udf --export...
--点击jar file --下一步
--展开db2019 --勾选com.ghgj.cn.udf
--修改jar file中的jar包的名称(myudf.jar) --Finish
2.将jar包上传到Linux
- [hadoop@hadoop01 ~]$ Alt+P #打开sftp
- sftp>
- 拖动jar包文件到SecureGRT对话框中
- [hadoop@hadoop01 ~]$ cd~
- [hadoop@hadoop01 ~]$ ls #查看列表中是否有myudf.jar
3.将jar包放在hive的classpath下
在hive客户端执行下面命令:add jar [jar包的路径]
hive> add jar /user/hadoop/myudf.jar;
结果:
added [/user/hadoop/myudf.jar] to class path
added resources:[/user/hadoop/myudf.jar]
表示命令执行成功,但是jar包不一定真的添加成功
检测jar包是否添加成功:
list jars;
若运行结果中有/user/hadoop/myudf.jar,代表添加成功
4.给自定义函数evaluate()添加别名,并在hive中注册这个函数
create temporary function my_fuc as 'com.ghgj.cn.udf.MyUdf';
temporary是临时的意思,代表hive当前客户端一旦关闭,my_fuc便失效;
as 后面跟的是主类名路径:
--eclipse中在代码中右击MyUdf --copy qualified name(则复制了MyUdf的全路径名)
5.查看hive的函数库中是否已添加自定义函数my_fuc
show functions;
内置函数有271个,若显示有272个,且能找到my_fuc,代表添加成功
注意:
- 以上方式添加的函数是临时的函数,hive当前客户端一旦关闭,my_fuc便失效;
- 若需要再次使用,则需要重复步骤3、4、5
- 生产中一般也使用这种临时的方式,若需要变成永久函数,需要改源码,太麻烦不建议使用。
hive上使用自定义函数
my_fuc有多个evaluate()方法,通过函数名称evaluate和参数(参数个数和类型)可以确定调用的是哪个方法
hive>select my_fuc(4); # 4%3=1,输出1 hive>select my_fuc(4,3); # 4+3=7,输出7 hive>select my_fuc('1.234.11.7'); # 输出001.234.011.007