51Testing软件测试论坛

标题: 第一个hive UDF函数 [打印本页]

作者: 樱花季节    时间: 2013-1-8 11:36
标题: 第一个hive UDF函数
本帖最后由 樱花季节 于 2013-1-8 15:58 编辑

hive提供了org.apache.hadoop.hive.ql.exec.UDF类,我们可以通过继承这个类来实现不同功能的函数,在脚本中很方便的调用它。


第一步,在eclipse中创建一个java项目,命名为HiveUDF
[attach]83149[/attach]


第二步,导入UDF需要的jar包,hive-exec-0.8.1.jar
[attach]83154[/attach]


hive-exec-0.8.1.jar这个jar包可以通过这里下载:
wget http://mirror.mel.bkb.net.au/pub ... e/hive-0.8.1.tar.gz
解压lib文件夹里面就有这个jar包



第三步,新建一个类,继承UDF类,命名为HelloWorldUDF,放在com.mxm.udf包下面
[attach]83152[/attach]


重写UDF类的evaluate方法,方法体中实现自己的逻辑
package com.mxm.udf;

import org.apache.hadoop.hive.ql.exec.UDF;

/**
* @ClassName:  HelloWorldUDF
* @Description:    TODO  
* @Author:   xiangmin.mengxm
* @CreateDate:   2013-1-8 上午11:21:04
*/
public class HelloWorldUDF extends UDF {


public String evaluate(String name){

return "hello world," + name;

}

}



第四步,将这个java文件打包成java jar,eclipse中选择该文件点击右键选择"export",选择好jar包的保存路径
[attach]83153[/attach]


第五步,将打好的jar包上传到hive server
-bash-3.2$ scp dwapp@10.20.151.57:/export/home/dwapp/mxm/python/HelloWorldUDF.jar  .


此时自定义UDF函数就完成了,下面需要把它加入到hive的环境中去
第六步,进入自己的hive环境,输入命令add jar HelloWorldUDF.jar
hive> add jar HelloWorldUDF.jar;
Added HelloWorldUDF.jar to class path
Added resource: HelloWorldUDF.jar


第七步,创建一个临时函数,名称自定义(给自定义的UDF取个名),as后面是jar包保存的类的名称
hive> create temporary function helloworld as 'com.mxm.udf.HelloWorldUDF';
OK
Time taken: 0.0060 seconds


第八步,使用这个函数
hive> select helloworld(name) from mxm_test2012102401;
Automatically selecting local only mode for query
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Execution log at: /tmp/dwdev/dwdev_20130108113535_2e4312fc-1571-4735-ac29-8fb5297bbd9e.log
Job running in-process (local Hadoop)
Hadoop job information for null: number of mappers: 0; number of reducers: 0
2013-01-08 11:35:58,069 null map = 0%,  reduce = 0%
2013-01-08 11:36:00,074 null map = 100%,  reduce = 0%
Ended Job = job_local_0001
2013-01-08 11:36:01     End of local task; Time Taken: 9.176 sec.
OK
hello world,mengxm
Time taken: 20.689 seconds

可以看到,通过hellworld这个函数,我成功的给select出来的name加上了helloworld

mxm_test2012102401表的建表脚本以及load数据脚本如下:
hive> create table mxm_test2012102401 (id int, name string) row format delimited fields terminated by ',' stored as textfile;
OK
Time taken: 0.143 seconds
hive> load data local inpath '/home/dwdev/mxm/a.txt' into table mxm_test2012102401;
Copying data from file:/home/dwdev/mxm/a.txt

a.txt如下:
-bash-3.2$ cat a.txt
1,mengxm


删除helloworld函数
hive> drop temporary function helloworld;
OK
Time taken: 0.0040 seconds






欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2