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>