1.准备
- Hadoop环境 是hadoop-2.6.0-cdh1.51.1
资源 | 路径 |
---|---|
hive-1.1.0-cdh5.15.1 | http://archive.cloudera.com/cdh5/cdh/5/ |
- 自定义的udf函数
新建的AddPrefixUDF 类继承UDF这个类,然后重写 evaluate ()方法 - 注意 要修改自定义的udf函数包路径
package org.apache.hadoop.hive.ql.udf;
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.util.Random;
public class AddPrefixUDF extends UDF{
public String evaluate(String input) {
Random random = new Random();
int num = random.nextInt(10);
return num + "_" + input;
}
public String evaluate(String input, int length) {
Random random = new Random();
int num = random.nextInt(length);
return num + "_" + input;
}
}
2.解压hive源码,添加自定义函数
[hadoop@hadoop001 software]$ tar -zxvf hive-1.1.0-cdh5.15.1-src.tar -C /home/hadoop/source
#添加自定义函数 在hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/udf路径下
[hadoop@hadoop001 udf]$ pwd
/home/hadoop/source/hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/udf
[hadoop@hadoop001 udf]$ ll AddPrefixUDF.java
-rw-r--r-- 1 root root 670 Oct 6 15:10 AddPrefixUDF.java
[hadoop@hadoop001 udf]$
- 注册自定义udf函数
#前往该路径 找到FunctionRegistry.java 类,在static 代码块中添加自定义udf函数信息
[hadoop@hadoop001 exec]$ pwd
/home/hadoop/source/hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/exec
[hadoop@hadoop001 exec]$ ll FunctionRegistry.java
-rw-rw-r-- 1 hadoop hadoop 68367 Oct 6 15:15 FunctionRegistry.java
[hadoop@hadoop001 exec]$
3.编译hive
mvn clean package -DskipTests -Phadoop-2 -Pdist
4.重新 部署hive或修改jar
- 4.1 修改jar
#将编译好的文件解压 获取 hive-exec-1.1.0-cdh5.15.1.jar文件
[hadoop@hadoop001 lib]$ ll hive-exec-1.1.0-cdh5.15.1.jar
-rw-r--r-- 1 hadoop hadoop 19635635 Oct 6 17:45 hive-exec-1.1.0-cdh5.15.1.jar
[hadoop@hadoop001 lib]$ pwd
/home/hadoop/app/hive/lib
#在已经部署好的hive 同一个位置 ,找到原有的jar,备份
编译后 的 hive-exec-1.1.0-cdh5.15.1.jar 放在当前位置
4.2 重新部署
https://blog.csdn.net/weixin_44131414/article/details/102395666
5.检测
hive> show functions;
abs
acos
add_months
#该函数既是 自定义函数
add_prefix
and
array
array_contains
ascii
asin
assert_true
#测试
hive> select add_prefix(domian) from access_log2;
#想要的结果
6_www.alibaba.com
7_www.ruozedata.com
3_www.alibaba.com
7_www.ruozedata.com
2_www.ruozedata.com
9_www.baidu.com
8_www.baidu.com
2_www.alibaba.com
5_www.baidu.com
2_www.baidu.com