目录
1、在一的基础上退出hive重新进入,会发现添加的UDF函数没有了,不能用了
(1)首先UDFHello.java 的 包更改为org.apache.hadoop.hive.ql.udf
3、修改exec文件下FunctionRegistry.java
一、实现简单的say_hello
1、打开IDE在pom.xml中添加如下
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>
点击maven 进行相关包导入,会有点慢
2、新建 UDFHello.java
内容如下:
package hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class UDFHello extends UDF {
public String evaluate(String name){
return "hello"+name;
}
}
3、打包
4、上传jar包至hive的lib下,并赋权
[peizk@hadoop lib]$ chmod 777 MapReduce-1.0.jar
5、进入Hive,添加jar包
hive (default)> add jar /home/peizk/app/hive-3.1.2/lib/MapReduce-1.0.jar;
可使用list jars 查看添加的jar包
hive (default)> list jars;
/home/peizk/app/hive-3.1.2/lib/MapReduce-1.0.jar
6、创建临时函数对应我们的jar包
语句如下:(指定我们函数在jar包位置)
create temporary function say_hello as "hive.udf.UDFHello"
执行如下
hive (default)> create temporary function say_hello as "hive.udf.UDFHello";
OK
Time taken: 0.46 seconds
7、测试一下
hive (default)> select say_hello('peizk');
OK
_c0
hellopeizk
Time taken: 1.657 seconds, Fetched: 1 row(s)
成功!
8、总结
(1)pom.xml 增加 hive-exec
(2)编写Java ,继承 UDF,实现方法 evaluate
(3)打包上传服务器lib下,并赋权
(4)进入hive 通过add jar 导入jar包
(5)创建临时函数指定jar包
(6)运行自定义UDF
二、将UDF函数注册到元数据里
1、在一的基础上退出hive重新进入,会发现添加的UDF函数没有了,不能用了
2、在HDFS上创建一个文件夹将我们的jar包上传上去
3、在hive上执行如下语句
hive (default)> create function say_hello as "hive.udf.UDFHello" using jar "hdfs://hadoop:9000/hive-udf/MapReduce-1.0.jar";
Added [/tmp/44d659a4-298c-4e98-8d60-9c088801a3b2_resources/MapReduce-1.0.jar] to class path
Added resources: [hdfs://hadoop:9000/hive-udf/MapReduce-1.0.jar]
OK
Time taken: 0.5 seconds
4、查看mysql 元数据库下的 FUNCS 表
5、hive执行UDF函数
hive (default)> select say_hello('peizk');
OK
_c0
hellopeizk
Time taken: 1.354 seconds, Fetched: 1 row(s)
注意在哪个hive库下添加,UDF在哪个库下有效
6、退出hive后再次重新进入执行
可以成功
三、通过hive -i 方法添加元数据
编写一个say_hello.sql 文件 内容如下:
add jar /home/peizk/app/hive-3.1.2/lib/MapReduce-1.0.jar;
create temporary function say_hello as "hive.udf.UDFHello";
使用 hive -i say_hello.sql 启动 hive 同样也可以使用UDF函数
四、通过编译源码,添加UDF
1、访问hive官网,下载源码
2、将我们写好的UDFHello.java文件放入相关目录
(1)首先UDFHello.java 的 包更改为org.apache.hadoop.hive.ql.udf
全部代码如下
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class UDFHello extends UDF {
public String evaluate(String name){
return "hello :"+name;
}
}
(2)将UDFHello.java 放入如下文件夹
apache-hive-3.1.2-src\ql\src\java\org\apache\hadoop\hive\ql\udf
3、修改exec文件下FunctionRegistry.java
目录如下
apache-hive-3.1.2-src\ql\src\java\org\apache\hadoop\hive\ql\exec
修改第一处
添加如下:
import org.apache.hadoop.hive.ql.udf.UDFHello;
修改第二处
添加如下
system.registerUDF("say_hello", UDFHello.class,false);
4、将文件打包上传服务器进行编译
5、进入家目录,进行编译,语句如下:
mvn clean package -DskipTests -Phadoop-2 -Pdist
6、编译成功
在如下目录处找到我们编译好的包
apache-hive-3.1.2-src/packaging/target