简介
如何在Hive中创建自定义函数UDF及使用 如何在Impala中使用Hive的自定义函数 UDF函数开发 使用Intellij工具开发Hive的UDF函数,进行编译
准备工作
创建 Maven 工程,导入如下依赖:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<!-- 版本号需要与hadoop集群中hive的版本号一致 -->
<version>3.1.2</version>
</dependency>
1. 代码
以判断某年是否为闰年为例:
package cn.kgc;
import org.apache.hadoop.hive.ql.exec.UDF;
public class IsLeapYear extends UDF {
public Boolean evaluate(int year){
if ((year%4 == 0 && year%100 != 0) || year%400 ==0)
return true;
else
return false;
}
}
2. 编译 jar 包
3. 在 Hive 中使用自定义函数(UDF)
3.1 创建临时 UDF
(1)进入 hive 客户端,执行如下命令,创建临时函数
add jar /root/hive_udf/hive_udf-1.0.jar;
create temporary function isLeapYear as 'cn.kgc.IsLeapYear';
(2)测试该 UDF 函数
select isLeap(2000);
+-------+
| _c0 |
+-------+
| true |
+-------+
3.2 创建永久 UDF
(1)在 HDFS 中创建相应目录,将 hive_udf-1.0.jar 包上传至该目录
[root@test hive_udf]# pwd
/root/hive_udf
[root@test hive_udf]# hdfs dfs -mkdir /udf
[root@test hive_udf]# hdfs dfs -put hive_udf-1.0.jar /udf
(2)进入 Hive 客户端,执行如下命令创建永久的 UDF
create function isLeapYear as 'cn.kgc.IsLeapYear' using jar 'hdfs://test:9820/udf/hive_udf-1.0.jar';
(3)退出客户端后重新进入,测试 UDF 函数,看是否生效
select isLeap(1900);
+--------+
| _c0 |
+--------+
| false |
+--------+
(4)Impala使用Hive的UDF(直接使用hive中的java的jar文件中函数,同步元数据即可,可以直接复用哦)
1.在Impala shell命令行执行元数据同步命令
impala> invalidate metadata;
测试:
重新同步元数据之后再次进行测试:
注意,如果这边在第一个impala-shell进去的时候,同步元数据之后还是不能使用hive创建的UDF函数的话,关闭客户端连接,重新进入就可以使用了
4. 删除UDF函数命令:
impala> drop function SubStrUdf;