Hive 的 UDF 函数(Python 版本)

文章介绍了Hive中用户自定义函数(UDF)的概念,包括UDF、UDAF和UDTF的类型和特点,并通过Python实现的示例,展示了如何处理输入数据和输出结果。案例包括将字母转大写、身份证解析以及统计学生成绩等,展示了Python在Hive中的数据处理能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hive 的 UDF 函数(Python 版本)

一、UDF 是什么

Hive 中支持很多的函数,可以极大的方便我们的工作。但是系统内置的函数虽然很多,却不能满足我们所有的需求。在遇到一些个性化需求的时候,系统内置的函数无法满足,此时就需要使用代码来完成自己的业务逻辑。

UDF: User Defined Function,字面来理解就是用户自定义的函数。其实展开来说,很多系统内置的函数也属于是 UDF 函数。UDF 函数的最大特点是“一对一”。即:一行输入、一行输出。例如,month 函数可以获取到一个日期中的月份。如果我们使用 month(birthday) 就可以获取到一个生日字段中的月份。一行数据中的生日的数据,带入到 month 函数中,就可以得到一行的月份信息。

UDAF: User Defined Aggregation Function,字面来理解就是用户自定义的聚合函数。其实展开来说,常见的聚合函数也属数据 UDAF 函数的。例如 sum, count, max, min, avg,这些函数是作用于某一列的多行数据的。接受多行数据的输入,输出一行的聚合结果。

UDTF: User Defined Table Generate Function,字面来理解就是用户自定义的表生成函数。这种函数可以接受一行的输入数据,输出多行的结果。例如 Hive 中的 explode 就是这样的函数,可以接受一个数组或者字典的数据,将其中的数据展开成多行。

二、UDF 函数的实现

Hive 本身是用 Java 语言来编写的,提供的 UDF 函数的接口也是 Java 的编程接口。但是 Hive 也同时提供了对 Python 的支持,使得可以使用 Python 的语言来编写自己的 UDF、UDAF、UDTF 的逻辑,并且实现起来比 Java 的更加简单!

本文只是记录 UDF 函数的 Python 实现版本!

Python 实现的 UDF、UDAF、UDTF 函数,需要对输入的一整行的数据进行处理,而并不是针对某一个字段进行处理!

  • 读取每一行的输入:可以使用 Python 中的标准输入流来读取。需要注意的是,无论 Hive 的表中是以什么样的字符进行分隔的,这里读取到的字段之间始终是以 \t 进行分隔的!因此我们也必须要使用 \t 进行字段的切割。
  • 输出一行的数据:在将一整行的数据处理完成之后,如果需要输出的时候,直接使用 print 函数打印即可。与输入的一样,输出的不同的字段之间也必须要使用 \t 进行分隔!
  • UDAF 函数实现、UDTF 函数实现:如果实现 UDAF、UDTF 这种输入行和输出行不一致的情况,直接控制 print 函数的输出次数即可。一次的 print 就会生成一行的数据,因此合理控制 print 函数的调用次数,即可实现 UDAF、UDTF 函数。
三、UDF 函数案例
案例一、将字母转成全部大写

1、准备数据文件

zhangsan,male,19
lisi,female,20
wangwu,male,18
zhaoliu,female,19

2、创建数据表

create table if not exists example_01(
	t_name string,
	t_gender string,
	t_age int
)
row format delimited
fields terminated by ',';

3、代码编写

# -*- coding: utf-8 -*-
# @Author   : 大数据章鱼哥
# @Company  : 北京千锋互联科技有限公司

# string_upper.py
import sys

for line in sys.stdin:
    print(line.upper(), end='')

4、应用函数

-- 应用UDF
add file string_upper.py

-- 查询名字,将其转成大写
select transform(t_name) using 'python3 string_upper.py' as (t_name) from example_01;
-- 查询名字、性别,将其转成大写
select transform(t_name, t_gender) using 'python3 string_upper.py' as (t_name, t_gender) from example_01;
案例二、只需要将姓名转成大写

1、数据准备

数据文件和表,沿用案例一即可

2、代码编写

# -*- coding: utf-8 -*-
# @Author   : 大数据章鱼哥
# @Company  : 北京千锋互联科技有限公司

# string_name_upper.py
import sys

for line in sys.stdin:
    # 1. 切割出来每一列
    columns = line.strip().split('\t')
    # 2. 判断切割出来的列的数量,如果数量不正确,这一行数据不处理
    length = len(columns
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值