FlinkSQL支持MultiJoin算子
本章节适用于MRS 3.5.0及以后版本。
当使用Flink的Full outer Join算子实现宽表拼接功能时,由于状态会被多次重复存储导致状态后端压力大,计算性能差。使用MultiJoin算子进行宽表拼接计算性能可以提升1倍。
FlinkSQL支持MultiJoin算子使用限制
- MultiJoin算子只支持FULL OUTER JOIN和INNER JOIN语法。
- MultiJoin算子只支持等值关联。如果有非等值过滤条件,可以使用view提前过滤。
- MultiJoin算子多表关联时所有的表关联键要一致。
- MultiJoin算子仅支持table.exec.state.ttl,不支持表级TTL以及JTL。
- Full outer join到MultiJoin状态不兼容,切换时无法通过快照恢复作业。
FlinkSQL支持MultiJoin算子使用方法
配置Flink作业时,可通过在FlinkServer WebUI的Flink作业开发界面添加自定义参数“table.optimizer.multi-join-enabled”为“true”开启MultiJoin算子功能,可参考如何创建FlinkServer作业。
CREATE TABLE datagen1 ( id int, f1 int, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'datagen' ); CREATE TABLE datagen2 ( id int, f2 int, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'datagen' ); CREATE TABLE datagen3 ( id int, f3 int, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'datagen' ); create view datagen3_view AS select * from datagen3 where id > 1; CREATE TABLE print ( id int, f1 int, f2 int, f3 int, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'print' ); insert into print select COALESCE(datagen1.id,datagen2.id,datagen3_view.id), datagen1.f1, datagen2.f2, datagen3_view.f3 from datagen1 Full outer join datagen2 on datagen1.id = datagen2.id Full outer join datagen3_view on datagen1.id = datagen3_view.id;