Hive中UDF的使用

UDF (User-Defined Function) 是对Hive自带函数的一种补充,并极大扩充了hql的作用范围,不仅使代码更加简洁,也减少了很多重复工作,提高任务执行效率。

工具下载

http://download.csdn.net/detail/arthas917/9275563

工具作用

  1. udf.Rank

    该函数用于分组limit输出,如『拉取每个用户的前100条语料』,需要对用户cuid进行分组后,再分别取每组的前100条语料。该函数原理为根据指定列的值(如cuid)对每一行进行递增编号,当指定列的值变化时再重新从0开始编号,利用这种方式,可以cluster by cuid后使用该函数编号得到一个新列,在where条件中过滤编号值小于100的行,即得到每组的前100条记录。该udf只有一个参数,参数值为指定的分组依据(如cuid)。

  2. udf.concat

    该函数用于合并连接多行,如『取用户在多天的访问记录,并将这些记录用’|’分割』,需要对用户每天的记录都取出来后再将多行的值拼接到一行里。目前hive自带的连接函数里有concat,作用为将两个列合并为一列,但如果想把多行的值合并连接到一行,则需要使用udf。该udf有两个参数,第一个参数为需要合并的列名,第二个参数为指定的分隔符号。

调用方式

分组limit输出

  1. 拷贝tools.jar到工作目录
  2. 在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为类名
  3. 在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条记录

合并连接多行

  1. 拷贝tools.jar到工作目录
  2. 在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为类名
  3. 在hql语句里调用:

    SELECT userid,city,concatTag(tags,'|') as totalTags FROM(
    SELECT userid,city,tags FROM
    userTags
    ) tmp
    GROUP BY userid,city;
    

    以上表示从userTags表里取用户在各个城市的访问记录,并用’|’连接,按用户userid输出。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值