问题

 

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下