UDTF(User Defined Table-Valued Functions)和UDF(User Defined Functions)在Flink和其他数据处理系统中有着明显的区别,主要体现在以下几个方面:
输出类型:
- UDF :
- UDF是用户定义的标量函数。
- 它接收一个或多个标量值作为输入,并返回一个标量值作为输出。
- UDTF :
- UDTF是用户定义的表值函数。
- 它接收一个或多个标量值作为输入,但可以返回多行数据(即多个标量值的组合)作为输出。
使用场景:
- UDF :
- 适用于需要处理并返回单个结果的场景,例如,计算字符串长度、进行数学运算等。
- UDTF :
- 适用于需要将单个输入拆分成多个输出的场景,例如,解析复杂的数据结构、将字符串拆分成单词等。
如何定义:
- UDF :
- UDF通常通过定义一个类并实现一个或多个方法(例如
eval
)来创建。 - 输出结果通过
return
语句返回。
- UDF通常通过定义一个类并实现一个或多个方法(例如
- UDTF :
- UDTF也是通过定义一个类来创建,但需要实现
eval
方法。 - 输出结果通过
yield
语句产生,而不是return
。
- UDTF也是通过定义一个类来创建,但需要实现
输出数据的结构:
- UDF :
- 输出是一个标量值,其类型在定义UDF时指定。
- UDTF :
- 输出是一个表(或行的集合),其结构(schema)在定义UDTF时指定。
示例:
UDF示例:
python
from pyflink.table import DataTypes
from pyflink.table.udf import udf
@udf(result_type=DataTypes.INT())
def length_udf(s: str) -> int:
return len(s)
UDTF示例:
python
from pyflink.table import DataTypes
from pyflink.table.udf import udtf
@udtf(output_types=[DataTypes.INT(), DataTypes.STRING()])
class SplitStringUDTF:
def eval(self, string):
for i, c in enumerate(string):
yield i, c
总结来说,UDF和UDTF的主要区别在于它们的输出类型和使用场景。UDF返回单个标量值,而UDTF返回多行数据。这使得UDTF在处理需要拆分和转换数据为多行结果的情况时非常有用。