Flink如何实现动态表与静态表的Join操作

本文探讨了FlinkTableAPI&SQL模块中流表与静态表Join的实现难题,介绍了通过UDTF解决的方法及其局限性,并深入解析了FlinkTable/SQL的执行流程。文章详细阐述了如何通过修改FlinkTable/SQL模块来支持流表与静态表的Join,包括静态表的伪装、识别、DataStreamAPI转换,以及性能优化策略。

问题介绍

动态表(以下简称流表)是Flink Table API & SQL 模块中的一个核心概念

Dynamic tables are the core concept of Flink’s Table API and SQL support for streaming data. In contrast to the static tables that represent batch data, dynamic table are changing over time.

当前Flink版本(1.5),Table APISQL都只支持流表与流表之间的Join操作,

Table left = tableEnv.fromDataStream(ds1, "a, b, c");
Table right = tableEnv.fromDataStream(ds2, "d, e, f");
Table result = left.join(right).where("a = d").select("a, b, e");

然而很多业务场景都需要流表与静态表之间的Join,这里的静态表可以看作是数据仓库中的维度表

UDTF实现

对于不支持流表与静态表Join这个问题,有人在Flink邮件组里提问过,社区给出的解决方案是通过UDTF来实现。

// The generic type "Tuple2<String, Integer>" determines the schema of the returned table as (String, Integer).
public class Split extends TableFunction<Tuple2<String, Integer>> {
   
   
    private String separator = " ";
    
    public Split(String separator) {
   
   
        this.separator = separator;
    }
    
    public void eval(String str) {
   
   
        for (String s : str.split(separator
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值