探究 Flink是如何把一条带join的Flink SQL转换成Table的 ?

本文探讨了如何在Flink 1.9版本中使用SQL与维表进行join操作,目前的挑战在于Flink SQL尚不直接支持流与维表的交互。作者通过研究dtstackstreamsql项目,提出通过扩展Flink SQL解析规则实现`join_dim`关键字。文章详细介绍了Flink SQL解析过程,包括从SQL到算子的转换,以及解析过程中关键类和方法的作用。作者计划通过修改FlinkSqlParserImplConstants关键字数组,添加`JOIN_DIM`,以实现自定义的join操作。
摘要由CSDN通过智能技术生成

Flink SQL功能很强大,但是现在基于1.9 的Flink SQL我们发现它缺少一些我很关心的功能,首先就是如何使用Flink SQL 的DDL或者insert语句把MySQL中的维表和Flink中的流表聚合起来而不使用代码级别的Table API

 

描述需求:

开发高阶API的目的是将复杂的技术逻辑下沉到低阶API中,以为平台的用户很可能不是一位代码开发者,不了解Flink技术,此时他只需要会编写Flink SQL就能自助产出自己想要的实时数据和实时报表,这将极大的扩展流平台在公司内部的用户,让更多分析师和决策者收益。

在日常开发报表时,你一定常会用到事实表与维度表join这种操作,在流数据体系中,维度表一定是实现存储在数据库中的,而Flink SQL暂时还没有支持流与维度表的交互;

最近参考了袋鼠云的dtstackstreamsql项目发现是编写一个.txt文件,提交到脚本上实现流和维表的join,同时可以支持异步IO,这个很赞,尤其是设计了mysql维表标识这个我觉得很方便,而我的愿景是通过在sql-client客户端实现一个join关键字就能实时的join维表并展示结果。

开发流平台功能使得用户只需要编写两条DDL(1个kafka中流表的结构,1个最终聚合表的结构)

和一个insert语句如下,即可实现流表和维表的聚合,并实时的insert到刚刚建好的聚合表中

insert into table (x,x,x,x) 
select  stream.col_1 , stream.col_2 , dim.column_1 , dim.column_2
from stream join_dim dim_in_mysql

第一:创建一张来自Kafka主题的流表(Flink 1.9已经支持),此处无需自己实现

第二:如何开发join_dim关键字 ??

整体思路是傻瓜式的

我现在的想法是,了解Flink SQL如何被转换成Flink Table的问题,需要先了解它如何解析SQL,并转换成算子,我想如果清楚这一整条流程,我们就可以拓展Flink SQL解析规则实现join_dim。

即:先看明白Flink开发者和calcite的开发者们是怎么解析join的,然后我照着他们的思路写一个join_dim其中的区别就是主动连接mysql的查询拿到JDBCType,把JDBCType转成Flink的TypeInfomation类型,和流表中的RowType数组一起拼出结果表的RowType数组,并把字段的数据也拼接起来,这样我就拿到了join维表之后的行结果。字段类型 + 字段 = Flink 表、行结果集合=表结果;然后就可以测试了。先别管同步还是异步,先能join起来冒烟儿就可以。

 

开始探索前我需要强调的事情:

我先写了个一个简单的table API demo,其中我使用的是Flink 1.9master分支中的blink planner(因为1.9主分支已经接纳了Blink planner),原因是2019年在北京参加了一些技术沙龙感觉Blink推广的挺不错的,听起来比Flink的 old Planner强大。

 

接下来进行Flink1.9 table.sqlQuery方法的debug。

table对象真正的引用是来自TableEnvironmentImpl,它重写了sqlQuery方法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值