如何在Hive中使用已注册的UDF?
# 超清晰:Hive 中**已注册 UDF** 的使用方法(一次学会、终身不踩坑)
我用**最简单、最实战**的方式告诉你:
**UDF 注册好之后,到底怎么用?**
---
# 一、先确认:你的 UDF 真的注册成功了吗?
## 1. 查看所有函数
```sql
show functions;
```
能看到你的 UDF 名字,说明注册成功。
## 2. 查看 UDF 详细信息(最关键)
```sql
desc function extended 你的UDF名;
```
例如:
```sql
desc function extended mask_phone;
```
如果显示 **class、jar 路径**,说明 **100% 注册成功**。
---
# 二、使用 UDF 的 3 种方式(直接复制就能跑)
## 方式1:直接在 SELECT 里用(最常用)
```sql
SELECT
id,
phone,
mask_phone(phone) -- 直接调用UDF
FROM user_table;
```
---
## 方式2:配合 WHERE / CASE WHEN 使用
```sql
SELECT
id,
mask_phone(phone)
FROM user_table
WHERE mask_phone(phone) IS NOT NULL;
```
---
## 方式3:插入数据时自动清洗(ETL 场景)
```sql
INSERT OVERWRITE TABLE user_mask
SELECT
id,
mask_phone(phone) -- 清洗后写入新表
FROM user_table;
```
---
# 三、如果 UDF 注册在**指定数据库**里
比如你注册时写的是:
```sql
create function db_test.mask_phone as 'com.xxx.MaskPhone' ...
```
使用时必须 **带库名**:
```sql
select db_test.mask_phone(phone) from user_table;
```
或者先切换库:
```sql
use db_test;
select mask_phone(phone) from user_table;
```
---
# 四、永久 UDF VS 临时 UDF 使用区别
## 1)永久UDF(注册到Hive元数据)
✅ 任何客户端都能用
✅ 重启Hive还在
✅ 所有人都能用
```sql
select mask_phone(phone) from table;
```
## 2)临时UDF(只当前会话有效)
❌ 关闭窗口就消失
❌ 别的连接不能用
```sql
-- 必须每次使用前执行
add jar /path/udf.jar;
create temporary function mask_phone as 'com.xxx.MaskPhone';
select mask_phone(phone) from table;
```
---
# 五、企业最标准 UDF 使用示例(脱敏实战)
## 注册(已完成)
```sql
create function mask_phone as 'com.udf.MaskPhone'
using jar 'hdfs:///user/hive/udf/myudf.jar';
```
## 使用
```sql
SELECT
user_id,
phone,
mask_phone(phone) AS phone_masked -- 脱敏后字段
FROM user_info;
```
## 结果
```
user_id phone phone_masked
1 13812345678 138****5678
```
---
# 六、最常见 4 个错误 + 10 秒解决
## 错误1:`Function mask_phone does not exist`
原因:
- UDF 没注册
- 注册的库和当前库不一致
- 临时UDF会话过期
解决:
```sql
show functions;
desc function extended mask_phone;
```
---
## 错误2:返回 NULL
原因:
- 你的 UDF 代码返回了 null
- 传入字段类型不匹配
解决:
检查 `evaluate` 方法是否处理了 null 值。
---
## 错误3:`Class Not Found`
原因:
- JAR 路径不对
- HDFS 权限不足
解决:
```bash
hdfs dfs -chmod 755 hdfs:///user/hive/udf/xxx.jar
```
---
## 错误4:调用 UDF 没反应
原因:
- 函数名写错
- 没有重启 Hive Server2
解决:
```
drop function mask_phone;
create function ...;
```
---
# 七、一句话总结(背会就够)
**UDF 注册好 = 系统函数,直接用!**
```sql
SELECT UDF名(字段名) FROM 表名;
```
---
## 你告诉我:
1. 你的 UDF 叫什么名字?
2. 是**临时**还是**永久**?
3. 报什么错?




