Flink 1.20处理时间时态Join是否支持FOR SYSTEM_TIME AS OF语法?
处理时间时态Join与Lookup Join的语法差异说明
Flink 1.20中文档的差异源于两种不同的处理时间关联场景,并非内容矛盾:
版本化维度表的处理时间时态Join
这是「处理时间时态Join」章节描述的场景:当关联的是维护了版本历史的维度表(比如记录汇率随时间变化的Rates表),此时确实不支持FOR SYSTEM_TIME AS OF语法,必须通过LATERAL TABLE调用表函数的方式,获取指定处理时间点的表版本,示例代码如下:SELECT o_amount, r_rate FROM Orders, LATERAL TABLE (Rates(o_proctime)) WHERE r_currency = o_currencyLookup Join(关联外部静态/准静态数据源)
这是「Lookup Join」章节的场景:当关联的是外部系统的静态或准静态数据源(比如通过JDBC连接的MySQL客户表),此时支持FOR SYSTEM_TIME AS OF语法,用来基于流数据的处理时间,实时查询外部数据源的最新数据,示例代码是合法的:-- Customers is backed by the JDBC connector and can be used for lookup joins CREATE TEMPORARY TABLE Customers ( id INT, name STRING, country STRING, zip STRING ) WITH ( 'connector' = 'jdbc', 'url' = 'jdbc:mysql://mysqlhost:3306/customerdb', 'table-name' = 'customers' ); -- enrich each order with customer information SELECT o.order_id, o.total, c.country, c.zip FROM Orders AS o JOIN Customers FOR SYSTEM_TIME AS OF o.proc_time AS c ON o.customer_id = c.id;
总结
- 若关联带版本历史的维度表:只能使用
LATERAL TABLE方式 - 若关联外部静态/准静态数据源(Lookup场景):支持
FOR SYSTEM_TIME AS OF语法
两者都属于处理时间维度的关联,但数据源类型和底层实现逻辑不同,因此文档会有不同的语法要求。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

