问题
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,执行如下命令:
- <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>
注册函数(registerUDF)
每次使用udf的时候都需要create temporary太麻烦,通过registerUDF可以免去此过程,有点麻烦需要下载,修改,编译hive-exec的源码,步骤如下:
- Eclipse创建SVN位置:
http://svn.apache.org/repos/asf/hive/tags/release-0.7.0
- 检出为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下