更新时间:2024-11-26 GMT+08:00
分享

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作业

SQL示例:
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;

相关文档