Flink自定义函数之表值函数(UDTF函数)

表值函数是用户定义的函数,接受零个或多个标量值输入,返回多行数据。它们通过扩展TableFunction接口实现,关键方法是eval。例如,SplitRowUdtf函数将字符串按特定分隔符拆分为两列产品和数量。

1.表值函数概念

用户定义的表值函数将零个,一个或多个标量值作为输入参数。返回任意数量的行作为输出,返回的行可以包含一个或多个列。

与标量函数区别:

相同:都是将零个、一个或多个标量值作为输入参数
差异:标量函数返回单个值作为输出,表值函数返回任意数量的行作为输出

2.表值函数实现

表值函数主要通过扩展TableFunction实现。(org.apache.flink.table.function包)

必须实现以下方法:

  • eval():评估方法,可重载

注意:

  1. 表值函数的行为由其评估方法决定。一个评估方法必须声明为public并命名为eval。
  2. 可实现多个名为eval的评估方法来重载TableFunction。
  3. 评估方法的参数类型决定了表值函数的所有有效参数。评估方法也可以支持变量参数,比如eval(String…str)
  4. 返回的表的类型由TableFunction的泛型类型决定。评估方法使用受保护的collect(T)方法发出输出行。

3.示例

import org.apache.flink.table.annotation.DataTypeHint;
import org.apache.flink.table.annotation.FunctionHint;
import org.apache.flink.table.functions.TableFunction;
import org.apache.flink.types.Row;
​
@FunctionHint(output = @DataTypeHint("ROW<product STRING, num STRING>"))
public class SplitRowUdtf extends TableFunction<Row> {
    public void eval(String a) {
        String[] split = a.split("-");
        String product = split[0];
        String num = split[1];
        collect(Row.of(product,num));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值