问题
hive无法按照5分钟对日志分组
方案
hive UDF
实现步骤
- 创建UDF:①extends UDF ②重写evaluate方法
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,执行如下命令:
#添加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);
注册函数(registerUDF)
每次使用udf的时候都需要create temporary太麻烦,通过registerUDF可以免去此过程,有点麻烦需要下载,修改,编译hive-exec的源码,步骤如下:
- Eclipse创建SVN位置:
- 检出为Java Project
创建项目时,删除项目的src目录(hive不需要这个文件夹)
右键项目,选择Properties -> Builder -> New... ,添加“Ant Builder”。
编辑弹出窗口, Main (tab) - > buildfile -> Browe Workspace,选择hive项目的build.xml文件
点击“OK” 按钮
这时已经开始build hive项目了,要下载依赖包,等着吧。
- 添加UDF到源码
放到这里:{Hive_source}\ql\src\java\org\apache\hadoop\hive\ql\udf
- 注册函数
打开文件:{Hive_source}\ql\src\java\org\apache\hadoop\hive\ql\exec\FunctionRegistry.java
添加如下两行:
import org.apache.hadoop.hive.ql.udf.UDFTrunc5min;
...
registerUDF("t5m", UDFTrunc5min.class, false);
- 将编译好的hive-exec-0.7.0.jar放到hive服务器lib下,干掉之前的jar包,就可以直接使用了,如果使用java client远程访问hive server,需要添加这个jar到自己的lib下