Join
本文为您介绍Regular Join、Interval Join、Temporal Join和Lookup Join变更的状态兼容性的详情。
Regular Join
当前不支持Regular Join相关算子的状态迁移,因此通常任何Join相关的变更(包括Join类型、Join condition和Join输入的Schema等),状态都属于不兼容变更。但如果Join等值或非等值条件发生了变更,并且变更的等值或非等值条件都可以下推到join的一侧input,形成带条件的calc节点,并且在运行参数配置中设置了table.optimizer.state-compatibility.ignore-filter: true
参数,该变更属于完全兼容。
Interval Join
当前不支持Interval Join相关算子的状态迁移,因此通常任何Join相关的变更(包括Join类型、Join condition、interval的大小和Join输入的Schema等),状态都属于不兼容变更。但以下场景的变更是完全兼容:
更改时间单位,但是最终值相同。
Join等值或非等值条件发生了变更,并且变更的等值或非等值条件都可以下推到Join的一侧input,形成带条件的calc节点,并且在运行参数配置中设置了
table.optimizer.state-compatibility.ignore-filter: true
参数。
Temporal Join
当前不支持temporal Join相关算子的状态迁移,因此通常任何Join相关的变更(包括Join类型、Join condition和Join输入的Schema等),状态都不兼容。
Lookup Join
Lookup Join默认为无状态节点,维表Lookup Join的修改不会影响算子自身的状态兼容,但输出改变时,可能会影响下游算子的状态兼容性。但以下两种特殊情况会使得Lookup Join节点成为有状态节点,可能会导致实际无法兼容的变更被错误显示为完全兼容,在作业启动时报错无法恢复:
如果您设置了作业参数
table.optimizer.non-deterministic-update.strategy: TRY_RESOLVE
,当Flink检测到维表Lookup Join产生了非确定性更新(Non-Deterministic Updates)时,Lookup Join算子会启用状态。如果维表配置了异步参数,Lookup Join算子将会启用状态。