官网地址
http://archive.cloudera.com/cdh5/cdh/5/
下载 hive-1.1.0-cdh5.15.1-src.tar.gz 源码包
版本及环境
hive-1.1.0-cdh5.15.1
注意:编译hive源码时,最好是在网络较好的且能通外网的环境,因为过程中会下载许多jar包,本次编译采用阿里云新加坡服务器。
自定义UDF
- 实现UDF功能
如:实现一个给字符串加随机数前缀的UDF
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.util.Random;
/**
* 添加随机数前缀
*/
@Description( //编写此函数的注释说明,可以不写
name = "addprefix",
value = "_FUNC_(String, int)",
extended = "Example:SELECT _FUNC_('hive',5);"
)
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;
}
}
- 将java类加入要编译的源码,编译后直接可使用
2.1 将java类复制到解压后的 /hive-1.1.0-cdh5.15.0/ql/src/java/org/apache/hadoop/hive/ql/udf 文件夹中!
2.2 修改 AddPrefixUDF类的包路径名,改为org.apache.hadoop.hive.ql.udf,因为将这个类拷复制到了/org/apache/hadoop/hive/ql/udf目录中。
2.3 进入 /hive-1.1.0-cdh5.15.0/ql/src/java/org/apache/hadoop/hive/ql/exec 目录,修改 FunctionRegistry.java 文件。
vim FunctionRegistry.java
...
import org.apache.hadoop.hive.ql.udf.AddPrefixUDF; // 添加包路径
...
system.registerUDF("addprefix", AddPrefixUDF.class, false); // 注册函数
...
编译
到/hive-1.1.0-cdh5.15.0目录下,执行以下命令:(需要有maven)
mvn clean package -DskipTests -Phadoop-2 -Pdist
编译成功后,会在 /hive-1.1.0-cdh5.15.0/packaging/target 路径下生成编译后的包:
apache-hive-1.1.0-cdh5.15.0-bin.tar.gz
部署hive
两种方法:
- 解压完全重新部署 hive。
- 把编译的包解压后的lib下的hive-exec-1.1.0-cdh5.15.0.jar 拷到现版本 $HIVE_HOME/lib 下,推荐这种方式!
部署完成,进入hive,执行:show functions;,即可看见自定义的UDF函数了。
临时注册UDF
hive> add jar /home/hadoop/lib/ruozedata-hadoop-1.0.jar;
hive> CREATE TEMPORARY FUNCTION add_prefix AS "com.ruozedata.bigdata.hive.udf.AddPrefixUDF";
此时,show functions即可找到函数名。
永久注册UDF
先将自定义jar把上传到hdfs。
hive> CREATE FUNCTION add_prefix_new AS "com.ruozedata.bigdata.hive.udf.AddPrefixUDF" USING JAR "hdfs://master:9000/lib/ruozedata-hadoop-1.0.jar";
此时,show functions并不能找到函数名,但是,在mysql中可以查到。
mysql> select * from hive.FUNCS;