将自定义函数 HelloUDF 编译到Hive源码中

1.编写UDF

1)使用idea+maven,在maven中添加相关参数

要引入 hadoop-client hive-exec

以下是我的 maven:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.ruozedata.hadoop</groupId>
<artifactId>g6-hadoop</artifactId>
<version>1.0</version>

<name>g6-hadoop</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>


<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<hadoop.version>2.6.0-cdh5.7.0</hadoop.version>
<hive.version>1.1.0-cdh5.7.0</hive.version>
</properties>

<!--添加CDH的仓库-->
<repositories>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository>
</repositories>

<dependencies>
<!--添加Hadoop的依赖-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!--添加hive的依赖-->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>${hive.version}</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
2)创建一个类,并编写一个UDF名字叫 HelloUDF.java

首先HelloUDF继承UDF这个类,然后重写 evaluate ()方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.ruozedata.hadoop.UDF;

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

public class HelloUDF extends UDF {

@Description(name = "helloUDF2",
value = "_FUNC_(input_str) - returns Hello : input_str ",
extended = "Example:\n "
+ " > SELECT _FUNC_('wxk') FROM src LIMIT 1;\n"
+ " 'Hello : wxk'\n")


public String evaluate(String input){

(这里写业务逻辑代码)
(传入 input 返回结果"Hello:"+input")

return "Hello:"+input;
}

}

2、下载源码

1
wget http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0-src.tar.gz

3、在源码中修改

1)添加helloUDF.java

1
2
3
4
5
将HelloUDF.java  放入 /home/source/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/udf 文件夹中

vi HelloUDF.java

将 package com.ruozedata.hadoop.UDF;; 修改为 package org.apache.hadoop.hive.ql.udf;

2)修改FunctionRegistry.java 文件

1
2
3
4
5
6
7
8
9
10
11
12
vi /home/source/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java 

文件头部 一长串 import 下添加,因为我们要吧这个UDF添加进去。
import org.apache.hadoop.hive.ql.udf.HelloUDF;

文件头部 static 块中添加 system.registerUDF("HelloUDF", HelloUDF.class, false);

如下:
static {
system.registerGenericUDF("concat", GenericUDFConcat.class);
system.registerUDF("HelloUDF", HelloUDF.class, false);
system.registerUDF("substr", UDFSubstr.class, false);

4、编译Hive源码

1
2
$>cd $HIVE_HOME
$>mvn clean package -DskipTests -Phadoop-2 -Pdist

编译成功

重新编译的包默认为:

1
/home/hadoop/source/hive-1.1.0-cdh5.7.0/packaging/target/apache-hive-1.1.0-cdh5.7.0-bin

5、部署

(重新部署 或者 只将 编译后的hive-exec-1.1.0-cdh5.7.0.jar 放到原来hive部署的位置即可。两种方式都可以!!)

5.1 在编译后的文件中找到 jar,并将原来的jar 替换。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[hadoop@hadoop001 lib]# pwd 
/home/hadoop/source/hive-1.1.0-cdh5.7.0/packaging/target/apache-hive-1.1.0-cdh5.7.0-bin/apache-hive-1.1.0-cdh5.7.0-bin/lib

[hadoop@hadoop001 lib]# ll hive-exec-1.1.0-cdh5.7.0.jar
-rw-r--r--. 1 hadoop hadoop 19276386 Sep 5 19:06 hive-exec-1.1.0-cdh5.7.0.jar

将原来的jar 后缀改掉:
[hadoop@hadoop001 lib]# mv hive-exec-1.1.0-cdh5.7.0.jar hive-exec-1.1.0-cdh5.7.0.jar.bak

拷贝到原hive 部署位置:
[hadoop@hadoop002 lib]# cp hive-exec-1.1.0-cdh5.7.0.jar /home/hadoop/app/hive-1.1.0-cdh5.7.0/lib/

查看
[hadoop@hadoop002 lib]# ll hive-exec-1.1.0-cdh5.7.0.*
-rw-r--r-- 1 hadoop hadoop 19276386 Sep 24 19:45 hive-exec-1.1.0-cdh5.7.0.jar
-rw-r--r-- 1 hadoop hadoop 19272159 Mar 24 2016 hive-exec-1.1.0-cdh5.7.0.jar.bak
5.2 重新解压部署

详情请看我的博客:https://skygzx.github.io/2019/04/07/Hive%E7%9A%84%E9%83%A8%E7%BD%B2/#more

6、测试:

1
hive (d6_hive)> show functions;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
hive (d6_hive)> select cdn,helloudf("ruoze") from g6_access limit 10; 
OK
cdn _c1
baidu Hello:ruoze
baidu Hello:ruoze
baidu Hello:ruoze
baidu Hello:ruoze
baidu Hello:ruoze
baidu Hello:ruoze
baidu Hello:ruoze
baidu Hello:ruoze
baidu Hello:ruoze
baidu Hello:ruoze
Time taken: 0.183 seconds, Fetched: 10 row(s)

本文标题:将自定义函数 HelloUDF 编译到Hive源码中

文章作者:skygzx

发布时间:2019年04月18日 - 18:50

最后更新:2019年04月18日 - 22:21

原始链接:http://yoursite.com/2019/04/18/自定义UDF编译到Hive源码中/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------
0%