1. Regular Join
类似与普通的两张表关联,当左右表任何一张表有数据变化时,最终关联的结果会进行更新,如这篇文章里面的示例图:
SELECT id, price, name FROM Price_Table A
Left Outer JOIN Name_Table B
ON A.id = B.id
①–⑥号输入数据,代表随时间增加,按顺序输入事件到左、右侧流。
①–⑥号输入数据,可以对应到最右侧Join后输出数据,-号代表回撤,+号代表最新数据
输入数据会更新左、右侧状态数据(内部一般都是MapState实现,如果当前侧为Outer,还会存储引用数,用于计算回撤)
2. 流和维表join
维表Join(SQL语句中具有FOR SYSTEM_TIME关键字)。维表Join(分同步和异步两种方式,可以查询维表数据库数据,补全流中字段信息,例如补全订单用户名场景)
3. Time Window Join
参考资料:Apache Flink 漫谈系列(12) - Time Interval(Time-windowed) JOIN-阿里云开发者社区
Flink intervalJoin 使用与原理分析_张普的专栏-CSDN博客
可实现两个流之间跨窗口join。
也可以叫做Time Interval Join,即Join条件中,带有时间范围的双流Join,例如订单表和付款表进行补全的场景,付款有1小时时效信息。(不用一直保留state,可以将无效过时的state清理掉;unbounded join则不会清理历史state,因此 time interval join比unbounded join更高效)。
unbounded join和time interval join都可以实现双流join。区别是time interval join会清理无效的state。
Time Window Join(条件上带有BETWEEN … AND时间表达式):
SELECT
o.orderId,
o.productName,
p.payType,
o.orderTime,
cast(payTime as timestamp) as payTime
FROM
Orders AS o JOIN Payment AS p
ON
o.orderId = p.orderId AND
p.payTime BETWEEN orderTime AND
orderTime + INTERVAL ‘1’ HOUR
5. 参考资料
FLink 源码分析--(三)Time Window Join_LS_ice的专栏-CSDN博客
Apache Flink 漫谈系列(12) - Time Interval(Time-windowed) JOIN-阿里云开发者社区