hive的UDF函数的使用。常见UDF函数

UDF的话一般是hive提供的函数功能满足不了业务需要,我们就会自己来写UDF函数来辅助完成,对于我们常用的函数而言还是哪些常见的聚合函数,如:count、sum、avg、max、min等,其他的话就要切合我们的需求来进行使用了,不过一般较为常用的有

1.cast(expr as <type>)  

可以做: cast('1' as BIGINT) 字符串转换为数字

2、if语句

if(boolean testCondition, T valueTrue, T valueFalseOrNull)

如果 testCondition 为 true 返回 valueTrue, 否则返回 valueFalse 或 Null

如: if(1 == 1, 1, 2) 结果为1

3、case语句

CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END

如:case when a == b then b when a == c then c else d end

4、字符串连接

concat(string1, string2, ...)

如:concat('hello', ' word') 结果为 hello word

5、计算字符串长度

length(string)

如:length('hello') 结果为5

6、查找子串的位置

locate(string substr, string str[, int pos])

如:locate('%', '100%') 返回3

7、聚合某一列数据

collect_set(col)    会去重

collect_list(col)    不会去重

 

 

如何构建UDF?

用户构建的UDF使用过程如下:
第一步:继承UDF或者UDAF或者UDTF,实现特定的方法。
第二步:将写好的类打包为jar。如hivefirst.jar.
第三步:进入到Hive外壳环境中,利用add jar /home/hadoop/hivefirst.jar.注册该jar文件
第四步:为该类起一个别名,create temporary function mylength as 'com.whut.StringLength';这里注意UDF只是为这个Hive会话临时定义的。
第五步:在select中使用mylength();

 

结合项目中使用

问题

hive无法按照5分钟对日志分组

方案

hive UDF

 

实现步骤

创建UDF:①extends UDF ②重写evaluate方法

Java代码  收藏代码

package com.xxx.udf;  

  

import java.math.BigDecimal;  

  

import org.apache.hadoop.hive.ql.exec.UDF;  

  

public class UDFTrunc5min extends UDF {  

  

    /**

     * truncate 5 minute

     *  

     * @param timestamp "1312128177.364"

     * @return

     */  

    public String evaluate(String timestamp) {  

        try {  

            return  new BigDecimal(timestamp).multiply(new BigDecimal("1000")).longValue() / 300000 * 300000 + "";  

        } catch (Exception e) {  

            return null;  

        }  

    }  

}  

 

 

将udf打jar包,并上传到hive server上

运行hive cli,执行如下命令:

Java代码  收藏代码

<span style="font-weight: normal;">#添加udf jar  

add jar /xxxx/xxx/my_udf.jar;  

  

#创建临时函数,临时函数,每次打开cli都需要创建function  

#如果是系统常用的函数可以发布到hive-exec项目,稍后介绍  

create temporary function t5m as 'com.xx.udf.Trunc5min';  

  

#使用udf  

select t5m(time) from log group by t5m(time);</span>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据架构师Pony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值