UDF概述
当Fabric SQL的内置函数无法满足用户业务场景时,用户可以使用自定义函数来封装业务逻辑,UDF的具体能力请参考自定义函数。
在FabricData SDK中支持了Scalar UDF、Class UDF、Vectorized UDF、UDTF、UDAF等不同类别UDF的注册和使用。
|
类型 |
输入 |
输出 |
描述 |
|---|---|---|---|
|
Scalar UDF(标量UDF) |
单行输入,多参数,例如(a, b, c) |
单行输出,一个标量,例如int/float/string/date |
最常见形式,每次被调用时只处理一行数据。可以做简单计算、格式化、清洗、转换。例如:字符串清洗、数学计算、日期转换。类比Python的普通函数。 |
|
Class UDF(类UDF) |
与Scalar UDF相同:单行输入 |
单行输出 |
是对Scalar UDF的OOP封装方式,适合有内部缓存、初始化参数、模型对象等情况。例如需要在函数内部加载一次模型、正则、配置。数据库只是在内部初始化一次,不需要每次调用都构建资源。 |
|
Vectorized UDF(向量化UDF) |
一次性输入一批行,类型为pandas.Series/pyarrow.ChunkedArray |
一次性输出同等数量行的向量化结构 |
性能最优的单行转换方式,用于批量处理。适合:向量化数学计算、文本批量处理、embedding处理、NLP分词。具有SIMD/批量执行优势,常用于Arrow、Pandas。 |
|
UDTF(User Defined Table Function,表函数) |
单行输入 |
多行输出 |
一个输入可能产出多个输出行。类似Python的yield。用于拆分、展开、解包结构化数据。例如:拆分JSON数组、展开多模态数据、音频/视频分片、tokenize、爆炸式展开。 |
|
UDAF(User Defined Aggregate Function,聚合函数) |
多行输入,可能来自多个分区 |
单个输出 |
对一组数据做聚合的函数:累加、统计、聚类、embedding聚合。具备accumulate、merge、finish生命周期,支持分布式执行。 |
UDF注册类型
不管是显式注册还是隐式注册,对于不同的UDF注册类型,其含义有所不同,详情参见下表:
|
UDF注册类型 |
含义 |
是否向量化 |
适用场景与特点 |
参考 |
|---|---|---|---|---|
|
python |
将一个原始的Python函数或者类注册进数据库中。 |
否 |
逐行处理数据,适用于简单或特定的计算,但性能较低。 |
|
|
builtin |
获得数据库已存在的函数的句柄,无实际注册的操作。 |
否 |
直接调用数据库后端已存在的函数,适用于利用数据库原生功能的场景。 |
|
|
pyarrow |
将一个接受pyarrow.ChunkedArray作为输入和输出的Python函数或类注册进数据库中。 |
是 |
利用Pandas的矢量化操作,适用于需要在Python层进行复杂数据处理的场景。 |
|
|
pandas |
将一个接受pandas.Series作为输入和输出的Python函数或类注册进数据库中。 |
是 |
利用PyArrow的高性能计算能力,适用于需要处理大型数据集或进行高效计算的场景。 |
对于Scalar UDF,目前支持全部上述4种注册类型。
对于UDAF、UDTF,目前仅支持上述的python、builtin这2种注册类型。
UDF运行时的额外参数
不管是显式注册还是隐式注册,对于所有的UDF类型,都支持在使用时通过with_arguments方法传入额外参数。这些参数包括了concurrency、min_concurrency、max_concurrency、timeout、dpu、apu,可以为UDF的执行提供细粒度的资源分配、并发度控制、时间上限等。
具体用法见UDF WITH ARGUMENTS使用语法。