Flink提供了多种流式join操作,我们可以根据实际情况选择最适合自己的类型。下面开始介绍不同的join类型。
Regular Joins(常规join)
Regular Joins是最通用的join类型,和传统数据库的 JOIN 语法完全一致。对于输入表的任何更新(包含插入、更新、删除),都会触发实时计算和更新,因此它的结果是“逐步逼近”最终的精确值,也就是下游可能看到变来变去的结果。为了支持结果的更新,下游目的表需要定义主键 (PRIMARY KEY NOT ENFORCED)。
支持 INNER、LEFT、RIGHT 等多种 JOIN 类型,但是目前仅支持等值条件的连接(on x=y)。
Regular Joins 运行时需要保留左表和右表的状态,且随着时间的推移,状态会无限增长,最终可能导致作业 OOM 崩溃或异常缓慢。因此我们强烈建议用户在 Flink 参数中设置 table.exec.state.ttl 选项,它可以指定 JOIN 状态的保留时间(定义键的状态在多长时间内没被更新过就会被删除),以便 Flink 及时清理过期的状态,默认值是0 ms,即保存所有状态。