点击箭头处“蓝色字”,关注我们哦!!
维表关联是离线计算或者实时计算里面常见的一种处理逻辑,常常用于字段补齐、规则过滤等,一般情况下维表数据放在MySql等数据库里面,对于离线计算直接通过ETL方式加载到Hive表中,然后通过sql方式关联查询即可,但是对于实时计算中Flink、SparkStreaming的表都是抽象的、虚拟的表,那么就没法使用加载方式完成。透过维表服务系列里面讲到的维表关联都是使用编码方式完成,使用Map或者AsyncIO方式完成,但是这种硬编码方式开发效率很低,特别是在实时数仓里面,我们希望能够使用跟离线一样sql方式完成维表关联操作。
在Flink1.9中提供了使用sql化方式完成维表关联,只需要实现LookupableTableSource接口即可,可以实现同步或者异步关联。在1.9之前就需要自己实现sql语法解析,然后在转换为API方式,对上层提供sql语法。看一个sql语句:
select * from orders o join gdsInfo g on o.gdsId=g.gdsId
orders表示流表,gdsInfo 表示维表。根据sql解析顺序先 from 部分、然后where 部分、最后select,那么对于join 方式,相当于join生成了一张临时表,然后去select 这张临时表,因此可以确认
sql解析流程:
1. 识别出流表与维表
2. 解析join部分,生成临时表
3. select 临时表
现在使用calcite解析这条语句
public class ParseDemo {
public static void main(String[] args) {
//假设gdsInfo就是维表
String sql = "select * from orders o join gdsInfo g on o.gdsId=g.gdsId";
SqlParser.Config config = SqlParser.configBuilder().setLex(Lex.MYSQL).build();
SqlParser sqlParser = SqlParser.create(sql, conf