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方法;