Hive UDF 开发与使用指南

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)、字符串特殊格式清洗、经纬度计算距离等。
  • 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" 这样的字符串按逗号分割成三行。
  • Java 基类org.apache.hadoop.hive.ql.udf.generic.GenericUDTF
  • 核心方法:需要重写 initialize()(定义输出格式)、process()(处理输入数据并转发结果)、close()(清理资源)。

3. 如何开发一个最简单的 UDF(以普通 UDF 为例)

我们以一个将字符串转换为全大写的简单 UDF 为例(虽然 Hive 有内置的 upper() 函数,但这非常适合演示)。

步骤 1:编写 Java 代码

  1. 创建一个 Maven 项目,在 pom.xml 中添加 Hive 依赖(注意版本与你使用的 Hive 版本一致)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值