Hive源码编译加入自定义UDF

官网地址

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

  1. 实现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;
    }
}
  1. 将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

两种方法:

  1. 解压完全重新部署 hive。
  2. 把编译的包解压后的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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值