Hive UDF(User Defined Function)函数主要分为 三大类:UDF、UDAF、UDTF。每类函数有不同的应用场景和实现方式。
✅ 一、UDF(User Defined Function)- 一进一出
特点
- 输入一行,输出一行(一对一映射)
- 最常用,如字符串处理、数值计算、日期转换等
实现方式
public class MyUDF extends UDF {
public String evaluate(String input) {
return input.toUpperCase();
}
}
常见内置 UDF 示例
-- 字符串处理
SELECT upper(name), lower(name), concat(first_name, ' ', last_name) FROM user;
-- 日期处理
SELECT date_add('2024-11-06', 1), unix_timestamp(), from_unixtime(1700000000) FROM log;
-- 数值计算
SELECT round(price, 2), ceil(amount), floor(discount) FROM order;
✅ 二、UDAF(User Defined Aggregate Function)- 多进一出
特点
- 输入多行,输出一行(聚合操作)
- 用于
GROUP BY场景,如COUNT、SUM、AVG等
实现原理
需要实现 UDAFEvaluator 接口,包含:
iterate():处理输入值terminatePartial():返回部分聚合结果merge():合并部分结果terminate():返回最终结果
常见内置 UDAF 示例
-- 聚合统计
SELECT
dept,
COUNT(*) AS total_count,
SUM(salary) AS total_salary,
AVG(salary) AS avg_salary,
COLLECT_LIST(name) AS employee_list -- 收集列表
FROM employee
GROUP BY dept;
✅ 三、UDTF(User Defined Table Function)- 一进多出
特点
- 输入一行,输出多行(行扩展操作)
- 最典型的例子是
LATERAL VIEW中使用的函数
实现方式
继承 GenericUDTF,实现:
initialize():初始化输出列process():处理输入行,多次调用forward()输出多行close():清理资源
常见内置 UDTF 示例
-- explode:展开数组/Map
SELECT user_id, hobby
FROM user_hobby
LATERAL VIEW explode(hobbies) t AS hobby;
-- posexplode:展开并带索引
SELECT user_id, idx, hobby
FROM user_hobby
LATERAL VIEW posexplode(hobbies) t AS idx, hobby;
-- json_tuple:解析 JSON 字符串
SELECT log_id, user_id, age, city
FROM json_log
LATERAL VIEW json_tuple(json_str, 'user_id', 'age', 'city') t AS user_id, age, city;
✅ 四、三类 UDF 对比总结
| 类型 | 输入输出 | 用途 | 典型场景 | 内置示例 |
|---|---|---|---|---|
| UDF | 1行 → 1行 | 转换处理 | 字符串/日期/数值处理 | upper(), date_add() |
| UDAF | 多行 → 1行 | 聚合统计 | GROUP BY 汇总 | COUNT(), SUM(), COLLECT_LIST() |
| UDTF | 1行 → 多行 | 行扩展 | LATERAL VIEW 展开 | explode(), posexplode() |
✅ 五、自定义 UDF 注册与使用
1. JAR 包注册
-- 添加 JAR
ADD JAR /path/to/your/udf.jar;
-- 创建临时函数
CREATE TEMPORARY FUNCTION my_upper AS 'com.example.MyUDF';
-- 使用
SELECT my_upper(name) FROM user;
2. 永久函数(需在 Hive 元数据中注册)
CREATE FUNCTION my_upper AS 'com.example.MyUDF'
USING JAR 'hdfs://path/to/udf.jar';
✅ 六、实际应用场景
UDF 应用
- 数据清洗:
clean_phone(phone)→ 格式化手机号 - 业务逻辑:
calculate_score(type, value)→ 计算用户积分
UDAF 应用
- 自定义聚合:
median(salary)→ 计算中位数 - 复杂统计:
percentile_approx(value, 0.9)→ 计算 90% 分位数
UDTF 应用
- 标签展开:
expand_tags(tag_string)→ 将逗号分隔的标签展开 - JSON 解析:
parse_json(json_str)→ 展开嵌套 JSON 为多行
📌 面试总结(一句话)
Hive UDF 分为 UDF(一进一出,如 upper)、UDAF(多进一出,如 count)、UDTF(一进多出,如 explode)三类,分别对应数据转换、聚合统计、行扩展三大场景,是 Hive 扩展性的重要体现。
掌握这三类 UDF 的区别和应用场景,是进行 Hive 二次开发和业务定制的关键技能。
2274



被折叠的 条评论
为什么被折叠?



