UDF是User defined Function的简写,意思是用户自定义方法。
UDF开发流程
1 eclipse开发一个java程序,导入hive的jar包
2 开发代码
3 将java程序打成jar包,上传到hive所在的机器上,
注意开发代码的环境和运行环境的jdk版本要一致,不然会报错Unsupported major.minor version 52.0
4 在hive的命令行中输入以下命令,将程序jar包添加到hive运行时的classpath中
5 在hive中创建一个函数名,映射到自己开发的java类:
下面是一个Demo:
有如下原始数据:
1,zhangsan:18:beijing|male|it,2000
2,lisi:28:beijing|female|finance,4000
3,wangwu:38:shanghai|male|project,20000
1先建表:
create table t_user(id int,user_info string,salary int) row format delimited fields terminated by ',';
2导数:
load data local inpath "/home/test.txt" into table t_user;
3上表不方便做细粒度的分析挖掘,需要将user_info字段拆解成多个字段,用hive自带的函数不方便,
通过自定义一个函数来实现拆解功能。
public class UserInfoParser extends UDF { public String evaluate(String field, int index) { String replaceAll = field.replaceAll("\|", ":"); --将|替换为: String[] split = replaceAll.split(":"); --字符串切割 return split[index-1]; } }
4将java程序打成jar包,上传到hive所在的机器上
5在hive的命令行中输入以下命令,将程序jar包添加到hive运行时的classpath中:
hive> add jar /home/badou/Documents/parseinfo.jar;
6在hive中创建一个函数名,映射到自己开发的java类:
hive> create temporary function parseinfo as 'hive_udf.UserInfoParse';
7接下来就可以使用自定义的函数uinfo_parse了
用函数拆解原来的字段,然后将结果保存到一张明细表中:
create table t_user_info as select id, parseinfo(user_info,1) as uname, parseinfo(user_info,2) as age, parseinfo(user_info,3) as addr, parseinfo(user_info,4) as sexual, parseinfo(user_info,5) as hangye, salary from t_user;
8 查询解析结果