1. 什么是 UDF?
UDF 的全称是 User-Defined Function,即用户自定义函数。Hive 虽然内置了丰富的函数(如 concat(), substr(), sum() 等),但有时这些函数无法满足特定的业务逻辑需求。这时,我们就可以通过编写 UDF 来扩展 Hive 的功能,实现自定义的处理逻辑。
简单来说,UDF 让你可以用 Java(或其他 JVM 语言,如 Scala)编写函数,然后在 HiveQL 中像使用内置函数一样使用它。
2. UDF 的类型
Hive 提供了三种主要的 UDF 类型,以适应不同的输入输出场景:
1. 普通 UDF
- 功能:一行输入,一行输出。这是最常见的 UDF。
- 应用场景:对单个数据行中的字段进行转换或计算。
- 示例:将手机号中间4位用
*隐藏(13812345678->138****5678)、字符串特殊格式清洗、经纬度计算距离等。
- 示例:将手机号中间4位用
- Java 基类:
org.apache.hadoop.hive.ql.exec.UDF - 核心方法:需要重写
evaluate方法。Hive 会根据你调用函数时传入的参数类型和数量,自动匹配对应的evaluate方法。支持重载。
2. UDAF
- 功能:多行输入,一行输出。类似于 SQL 中的聚合函数。
- 应用场景:对一组数据行进行聚合计算。
- 示例:计算平均值、求中位数、统计唯一值个数、字符串连接等。
- Java 基类:
org.apache.hadoop.hive.ql.exec.UDAF - 实现方式:比 UDF 复杂,通常需要实现一个内部类
Evaluator,并重写其init(),iterate(),terminatePartial(),merge(),terminate()等方法。现在更推荐使用GenericUDAFResolver2接口进行实现,灵活性更高。
3. UDTF
- 功能:一行输入,多行输出。用于生成或“爆炸”数据。
- 应用场景:将单个复杂字段拆分成多行。
- 示例:解析 JSON 数组或
explode()函数类似的功能,将"a,b,c"这样的字符串按逗号分割成三行。
- 示例:解析 JSON 数组或
- Java 基类:
org.apache.hadoop.hive.ql.udf.generic.GenericUDTF - 核心方法:需要重写
initialize()(定义输出格式)、process()(处理输入数据并转发结果)、close()(清理资源)。
3. 如何开发一个最简单的 UDF(以普通 UDF 为例)
我们以一个将字符串转换为全大写的简单 UDF 为例(虽然 Hive 有内置的 upper() 函数,但这非常适合演示)。
步骤 1:编写 Java 代码
-
创建一个 Maven 项目,在
pom.xml中添加 Hive 依赖(注意版本与你使用的 Hive 版本一致)。

最低0.47元/天 解锁文章
1494

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



