`
heipark
  • 浏览: 2076713 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hive UDF(User-Defined-Function) 实战

阅读更多

 问题

 

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位置:

 

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下


 

分享到:
评论
3 楼 myemptyname 2013-07-30  
mark
2 楼 heipark 2011-09-06  
kezhon 写道
前辈能不能请教个问题,我在使用hive写UDF时,函数需要引用外部resource中的文件,但是运行时就报
java.io.FileNotFoundException: resource/placeMap.txt (No such file or directory)。
但是在本地运行无误。
请问可以怎么解决?非常感谢!



分布式运行,必须保证每台datanode都可以访问到这个文件,那理论上这个文件应该放到hdfs上。
1 楼 kezhon 2011-09-06  
前辈能不能请教个问题,我在使用hive写UDF时,函数需要引用外部resource中的文件,但是运行时就报
java.io.FileNotFoundException: resource/placeMap.txt (No such file or directory)。
但是在本地运行无误。
请问可以怎么解决?非常感谢!

相关推荐

Global site tag (gtag.js) - Google Analytics