时间旅行
This documentation is for an unreleased version of Apache Flink. We recommend you use the latest stable version.

时间旅行 #

Batch Streaming

时间旅行语法主要用于查询历史数据。它允许用户指定一个时间点,查询对应时间点 table 的数据。

注意 目前, 时间旅行语法需要查询 table 所属的 catalog 实现了 getTable(ObjectPath tablePath, long timestamp) 接口。 更多详细信息,请参考 Catalog

带有时间旅行子句的语法如下所示:

SELECT select_list FROM table_name FOR SYSTEM_TIME AS OF timestamp_expression

参数说明:

  • FOR SYSTEM_TIME AS OF timestamp_expression:用于特定的时间表达式,用于查询该时间点之前的数据。timestamp_expression 用于表示需要查询的时间点。timestamp_expression 可以是一个具体的 TIMESTAMP 常量或者是可以简化为 TIMESTAMP 常量的时间表达式,该表达式只能作用于物理表不能是视图或者子查询。

示例 #

--使用时间常量
SELECT select_list FROM paimon_tb FOR SYSTEM_TIME AS OF TIMESTAMP '2023-07-31 00:00:00'

--使用可以转换为时间常量的时间表达式
SELECT select_list FROM paimon_tb FOR SYSTEM_TIME AS OF TIMESTAMP '2023-07-31 00:00:00' - INTERVAL '1' DAY

限制 #

注意 时间旅行 中使用的时间表达式只支持 TIMESTAMP 常量表达式, TIMESTAMP 加减运算, 以及部分内置函数UDF

当时间表达式中使用 UDF 或者函数时, 由于当前框架的限制,部分表达式无法在 SQL 解析时直接换为一个 TIMESTAMP 常量,会直接抛出异常。

--使用无法在 SQL 解析时直接转换为时间常量的时间表达式
SELECT select_list FROM paimon_tb FOR SYSTEM_TIME AS OF TO_TIMESTAMP_LTZ(0, 3)

对应的异常如下:

Unsupported time travel expression: TO_TIMESTAMP_LTZ(0, 3) for the expression can not be reduced to a constant by Flink.

时区的处理 #

TIMESTAMP 表达式生成的数据类型是 TIMESTAMP 类型,但在时间旅行语句中有一个特殊情况。执行时间旅行语句时,框架会根据本地时区TIMESTAMP 类型转换为 LONG 类型。 因此,在不同的时区执行相同的时间旅行查询语句可能会得到不同的结果。