UDF (User-Defined Function) 是对Hive自带函数的一种补充,并极大扩充了hql的作用范围,不仅使代码更加简洁,也减少了很多重复工作,提高任务执行效率。
工具下载
http://download.csdn.net/detail/arthas917/9275563
工具作用
udf.Rank
该函数用于分组limit输出,如『拉取每个用户的前100条语料』,需要对用户cuid进行分组后,再分别取每组的前100条语料。该函数原理为根据指定列的值(如cuid)对每一行进行递增编号,当指定列的值变化时再重新从0开始编号,利用这种方式,可以cluster by cuid后使用该函数编号得到一个新列,在where条件中过滤编号值小于100的行,即得到每组的前100条记录。该udf只有一个参数,参数值为指定的分组依据(如cuid)。
udf.concat
该函数用于合并连接多行,如『取用户在多天的访问记录,并将这些记录用’|’分割』,需要对用户每天的记录都取出来后再将多行的值拼接到一行里。目前hive自带的连接函数里有concat,作用为将两个列合并为一列,但如果想把多行的值合并连接到一行,则需要使用udf。该udf有两个参数,第一个参数为需要合并的列名,第二个参数为指定的分隔符号。
调用方式
分组limit输出
- 拷贝tools.jar到工作目录
在hql开头加上如下内容:
ADD jar tools.jar;
create temporary function rankCol as ‘udf.Rank’;说明:
- 『ADD jar tools.jar』表示将工具上传至HDFS目录;
- 『create temporary function rankCol as ‘udf.Rank’』表示创建一个自定义函数,命名为rankCol,函数位置位于tools.jar工具包里的udf.Rank——udf为包名,Rank为类名
在hql语句里调用:
select userid,log from ( select userid,log,rankCol(userid) as colid from (select userid,log from testLog cluster by userid) tmpin ) tmpout where colid<100;
以上表示从testLog里根据userid取每个用户的前100条记录
合并连接多行
- 拷贝tools.jar到工作目录
在hql开头加上如下内容:
ADD jar tools.jar;
create temporary function concatTag as ‘udf.concat’;说明:
- 『ADD jar tools.jar』表示将工具上传至HDFS目录;
- 『create temporary function concatTag as ‘udf.concat’』表示创建一个自定义函数,命名为concatTag,函数位置位于tools.jar工具包里的udf.concat——udf为包名,concat为类名
在hql语句里调用:
SELECT userid,city,concatTag(tags,'|') as totalTags FROM( SELECT userid,city,tags FROM userTags ) tmp GROUP BY userid,city;
以上表示从userTags表里取用户在各个城市的访问记录,并用’|’连接,按用户userid输出。