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
类型。
因此,在不同的时区执行相同的时间旅行查询语句可能会得到不同的结果。