准备
hive-1.1.0-cdh5.7.0-src.tar.gz
JDK环境配置
Maven环境配置
编写自定义UDF函数
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
/**
* 这里实现的是将两个字符串拼接的功能
* 自定义UDF需要继承UDF类,并添加evaluate方法,可以有多个重载方法
* 注:UDF类是没有evaluate方法的,方法名不能写错。
*/
public class UDFAppend extends UDF {
public Text evaluate(final Text s, final Text text) {
if (s == null || text == null) { return null; }
return new Text(s.toString() + text.toString());
}
}
解压hive源码
tar -zxvf hive-1.1.0-cdh5.7.0-src.tar.gz #解压
#将自定的udf类放在指定的包中
cp UDFAppend.java hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/udf/
# 在FunctionRegistry 类中将 UDFAppend 注册为永久函数
# 在静态块中添加一行注册代码:system.registerUDF("append",org.apache.hadoop.hive.ql.udf.UDFAppend.class,false);
vi hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
cd hive-1.1.0-cdh5.7.0/ql/ #这个子模块中包含了hive udf函数和函数注册
#编译hive-exec子模块(即 ql),编译成功后在target下找到 hive-exec-1.1.0-cdh5.7.0.jar
mvn clean package -DskipTests -Phadoop-2 -Pdist
#将编译出的hive-exec-1.1.0-cdh5.7.0.jar 放在$HIVE_HOME/lib中,替换原来的jar,重启hive即可
mv target/hive-exec-1.1.0-cdh5.7.0.jar $HIVE_HOME/lib
#注:有兴趣也hive的源码根目录中执行 mvn clean package -DskipTests -Phadoop-2 -Pdist 编译整个出hive应用程序
#编译出来的应用程序在 hive-1.1.0-cdh5.7.0/packaging/target 下:apache-hive-1.1.0-cdh5.7.0-bin.tar.gz