自定义UDF,并整合到Hive源码

在Hive中已经为我们提供了部分函数
在这里插入图片描述
但是在生产实践当中,这些还远远不够,我们可以通过Hive官网提供的方法https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateFunction,来创建自定义函数。
但在这里,我们介绍另外一种较为繁琐的方法,将UDF整合到hive源码,并对hive源码进行编译,使得我们的函数和hive自带的函数一样,打开hive便可以使用

1.开发UDF

pom部分依赖如下:

<hadoop.version>2.6.0-cdh5.7.0</hadoop.version>
<hive.version>1.1.0-cdh5.7.0</hive.version>

<repository>
  <id>cloudera</id>
  <url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository>

<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-client</artifactId>
  <version>${hadoop.version}</version>
</dependency>

<dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-exec</artifactId>
  <version>${hive.version}</version>
</dependency>

我的UDF如下:
HelloUDF.java

import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

@Description(name = "HelloUDF,
        value = "_FUNC_(input_str) - returns Hello : input_str ",
        extended =  "Example:\n "
                + "  > SELECT _FUNC_('moyuan') FROM src LIMIT 1;\n"
                + "  'Hello : moyuan'\n")
public class HelloUDF extends UDF {
    public Text evaluate( Text input){
        return new Text("Hello: "+input);
    }
}

2.下载hive源码包并解压

hive 源码可在http://archive.cloudera.com/cdh5/cdh/5/自行下载

	[hadoop@hadoop software]$ tar -zxvf hive-1.1.0-cdh5.7.0-src.tar.gz -C ../source/
	[hadoop@hadoop hive-1.1.0-cdh5.7.0]$ pwd
	/home/hadoop/source/hive-1.1.0-cdh5.7.0

3.对hive源码包进行变动

	1.将HelloUDF.java移动至/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/udf文件夹下
	
	2.修改HelloUDF.java,将package目录改为package org.apache.hadoop.hive.ql.udf;
	
	3.修改/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java 
	引入我们的UDF
	import org.apache.hadoop.hive.ql.udf.HelloUDF;
	static {
		    system.registerGenericUDF("concat", GenericUDFConcat.class);
		    system.registerUDF("HelloUDF", HelloUDF.class, false);
		    system.registerUDF("substr", UDFSubstr.class, false);
		    ...}

4.对hive源码进行编译

	[hadoop@hadoop hive-1.1.0-cdh5.7.0]$ mvn clean package -DskipTests -Phadoop-2 -Pdist

等待之后
在这里插入图片描述
此时要用我们的UDF,可以采用两种方式
1.用我们编译好的hive,重新部署
2.将/home/hadoop/source/hive-1.1.0-cdh5.7.0/packaging/target 中hive目录下的lib中的hive-exec-1.1.0-cdh5.7.0.jar替换到我们现在用的$HIVE_HOME/lib下即可

来看我们到底成功没有

	hive> show functions;

在这里插入图片描述

	hive> select helloudf("moyuan") from dual;
	OK
	Hello: moyuan
	Time taken: 0.056 seconds, Fetched: 1 row(s)
	hive>

成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值