如何在 Hive 中注册和管理 UDF?
# Hive 注册 & 管理 UDF 最全实战指南(企业级标准)
我给你整理**最清晰、最常用、不踩坑**的全套流程:**临时UDF、永久UDF、删除UDF、查看UDF、重载UDF、权限问题**,全部一次性讲透。
---
# 一、UDF 三种类型(先分清)
1. ** Temporary UDF(临时函数)**
只在当前会话有效,关闭 hive 客户端就消失
→ 测试用
2. ** Permanent Function(永久函数)**
注册到 Hive 元数据,所有人、所有会话都能用
→ **生产环境标准用法**
3. ** Permanent Function with Jar on HDFS**
企业最标准、最稳定、必须用
→ **JAR 放在 HDFS,所有人都能访问**
---
# 二、最常用:注册 **临时 UDF**(测试用)
## 1. 上传 jar(本地路径)
```sql
add jar /home/hive/udf/myudf.jar;
```
## 2. 创建临时函数
```sql
create temporary function mask_phone as 'com.xxx.MaskPhone';
```
## 3. 直接使用
```sql
select mask_phone('13812345678');
```
---
# 三、企业标准:注册 **永久 UDF**(必须会)
## 步骤 1:把 JAR 传到 HDFS(关键)
```bash
hdfs dfs -put myudf.jar /user/hive/udf/
```
## 步骤 2:注册永久函数
```sql
CREATE FUNCTION mask_phone AS 'com.xxx.MaskPhone'
USING JAR 'hdfs:///user/hive/udf/myudf.jar';
```
✅ **优点:**
- 永久生效
- 所有客户端可用
- 重启 Hive 也在
- 跨会话、跨用户
---
# 四、注册到指定数据库(生产常用)
```sql
CREATE FUNCTION db_name.mask_phone AS 'com.xxx.MaskPhone'
USING JAR 'hdfs:///user/hive/udf/myudf.jar';
```
使用时:
```sql
select db_name.mask_phone(phone);
```
---
# 五、查看所有 UDF(必用)
## 1. 查看所有函数
```sql
show functions;
```
## 2. 查看某个 UDF 信息
```sql
desc function extended mask_phone;
```
会显示:
- 类路径
- JAR 路径
- 函数类型
---
# 六、删除 UDF
## 1. 删除永久函数
```sql
DROP FUNCTION IF EXISTS mask_phone;
```
## 2. 删除指定库的 UDF
```sql
DROP FUNCTION IF EXISTS db_name.mask_phone;
```
## 3. 删除临时函数
```sql
DROP TEMPORARY FUNCTION IF EXISTS mask_phone;
```
---
# 七、更新 / 重载 UDF(代码改了怎么更新?)
## 方法 1:删除重建
```sql
DROP FUNCTION mask_phone;
CREATE FUNCTION mask_phone AS 'com.xxx.MaskPhone'
USING JAR 'hdfs:///user/hive/udf/myudf.jar';
```
## 方法 2:覆盖 HDFS 上的 JAR,重启 Hive Server2
```bash
hdfs dfs -put -f myudf.jar /user/hive/udf/
```
然后重启 hive-server2 生效。
---
# 八、UDF 权限问题(90% 的人踩过坑)
## 报错:
- Permission denied
- Class Not Found
- Unable to read jar
## 解决:
```bash
hdfs dfs -chmod 755 /user/hive/udf/myudf.jar
hdfs dfs -chown hive:hive /user/hive/udf/myudf.jar
```
---
# 九、企业级 UDF 注册模板(直接复制)
## 1. 上传到 HDFS
```bash
hdfs dfs -mkdir -p /user/hive/udf
hdfs dfs -put myudf.jar /user/hive/udf/
hdfs dfs -chmod 755 /user/hive/udf/myudf.jar
```
## 2. 注册永久函数
```sql
CREATE FUNCTION default.mask_phone AS 'com.company.udf.MaskPhone'
USING JAR 'hdfs:///user/hive/udf/myudf.jar';
```
## 3. 测试
```sql
SELECT mask_phone('13900001111');
```
---
# 十、最常用命令汇总(背会)
```sql
-- 注册临时
add jar /path/xxx.jar;
create temporary function 函数名 as '全类名';
-- 注册永久
create function 函数名 as '全类名' using jar 'hdfs://path/xxx.jar';
-- 查看
show functions;
desc function extended 函数名;
-- 删除
drop function 函数名;
```

