一、注册到Hive源码目的
在上一篇UDF函数博文中说过,Hive自带的函数并不能满足日常工作,有很多功能需要我们自己去编写。对于经常使用的功能就希望注册到Hive当中和Hive的函数一样使用了。
二、IDEA构建UDF函数
三、注册到Hive源码
1、下载Hive源码
2、将Hive源码放到/opt/sourcecode目录下并解压
[root@hadoop001 sourcecode]# ls
hive-1.1.0-cdh5.7.0 hive-1.1.0-cdh5.7.0-src.tar.gz
3、将IDEA构建的HelloUDF2.java放到以下目录(Hive自带函数目录)
/opt/sourcecode/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/udf
4、修改HelloUDF2.java
vi HelloUDF2.java
将package com.ruozedata.hive更改成package.org.apache.hadoop.hive.ql.udf
5、修改FunctionRegistry.java 文件
vi /opt/sourcecode/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
在FunctionRegistry.java文件19行下面添加
import org.apache.hadoop.hive.ql.udf.HelloUDF2;
在static{}代码块(174行)中添加
system.registerUDF("HelloUDF2", HelloUDF2.class, false);
四、开始编译
在/opt/sourcecode/hive-1.1.0-cdh5.7.0路径下执行
cd /opt/sourcecode/hive-1.1.0-cdh5.7.0
#编译时间较长,耐心等待
mvn clean package -DskipTests -Phadoop-2 -Pdist
编译完成后会在/opt/sourcecode/hive-1.1.0-cdh5.7.0/packaging目录下生成一个target文件夹
target文件夹下的apache-hive-1.1.0-cdh5.7.0-bin.tar.gz包就是编译之后的文件
五、验证及使用
如果要使用自己构建的函数有两种方法
㈠将apache-hive-1.1.0-cdh5.7.0-bin.tar.gz部署到机器上,可以参考Hive简单部署
然后hive (default)> show functions;
可以看到helloudf2函数(add jar方式看不到)
查看函数的描述
hive (default)> desc function extended helloudf2;
OK
tab_name
helloudf2(input_str) - returns Hello:input
Example:
> SELECT helloudf2('zhangsan') FROM src LIMIT 1;
'Hello:zhangsan'
Time taken: 0.032 seconds, Fetched: 4 row(s)
㈡如果你已经部署了Hive了那么采用下面的方式
备份已部署的Hive的hive-exec-1.1.0-cdh5.7.0.jar文件
mv $HIVE_HOME/lib/hive-exec-1.1.0-cdh5.7.0.jar $HIVE_HOME/lib/hive-exec-1.1.0-cdh5.7.0.jar.bak
将编译后的hive-exec-1.1.0-cdh5.7.0.jar文件拷贝到$HIVE_HOME/lib/目录下
cp hive-exec-1.1.0-cdh5.7.0.jar $HIVE_HOME/lib
然后查看是否成功(有时需要hive-exec-1.1.0-cdh5.7.0.jar.bak文件移除lib才可以成功)
hive (default)> show functions;
hive (default)> desc function extended helloudf2;
功能已实现
hive (default)> select ename,helloudf2(ename) from emp;
OK
ename _c1
SMITH Hello:SMITH
ALLEN Hello:ALLEN
WARD Hello:WARD
JONES Hello:JONES
MARTIN Hello:MARTIN
BLAKE Hello:BLAKE
CLARK Hello:CLARK
SCOTT Hello:SCOTT
KING Hello:KING
TURNER Hello:TURNER
ADAMS Hello:ADAMS
JAMES Hello:JAMES
FORD Hello:FORD
MILLER Hello:MILLER
HIVE Hello:HIVE