更新时间:2026-06-11 GMT+08:00
分享

时间旅行

前提条件

在Spark中使用Iceberg前,需先配置Spark目录,spark_catalog和prod目录配置请参见Iceberg Catalog配置。Iceberg基于Apache Spark的DataSourceV2 API实现数据源和目录功能。

基本语法

  • SQL命令

    Spark 3.3及之后版本支持在SQL查询中使用TIMESTAMP AS OFVERSION AS OF子句实现时间旅行。其中,VERSION AS OF子句可接受长整数类型的快照 ID,或字符串类型的分支/标签名称。

    • 时间旅行至1986年10月26日01:21:00:
      SELECT * FROM prod.db.table TIMESTAMP AS OF '1986-10-26 01:21:00'; 
    • 时间旅行至快照ID 10963874102873:
      SELECT * FROM prod.db.table VERSION AS OF 10963874102873;

      查询current-snapshot-id快照ID的命令为:

      DESCRIBE EXTENDED prod.db.table;
    • 时间旅行至分支“audit-branch”的所引用的快照:
      SELECT * FROM prod.db.table VERSION AS OF 'audit_branch';
    • 时间旅行至标签“historical-snapshot”所引用的快照:
      SELECT * FROM prod.db.table VERSION AS OF 'historical_snapshot';

    还支持FOR SYSTEM_TIME AS OFFOR SYSTEM_VERSION AS OF语法,功能与TIMESTAMP AS OFVERSION AS OF一致,例如:

    • 示例一:
      SELECT * FROM prod.db.table FOR SYSTEM_TIME AS OF '1986-10-26 01:21:00'; 
    • 示例二:
      SELECT * FROM prod.db.table FOR SYSTEM_VERSION AS OF 10963874102873; 
    • 示例三:
      SELECT * FROM prod.db.table FOR SYSTEM_VERSION AS OF 'audit_branch'; 
    • 示例四:
      SELECT * FROM prod.db.table FOR SYSTEM_VERSION AS OF 'historical_snapshot';

    时间戳也可使用Unix时间戳(秒级) 传入,例如:

    SELECT * FROM prod.db.table TIMESTAMP AS OF 499162860;

    或可使用:

    SELECT * FROM prod.db.table FOR SYSTEM_TIME AS OF 499162860;

    分支或标签也可通过类似元数据表的语法指定,格式为“branch_<分支名>”或“tag_<标签名>”:

    SELECT * FROM prod.db.table.branch_audit_branch;

    或可使用:

    SELECT * FROM prod.db.table.tag_historical_snapshot;

    -等特殊字符的标识符不合法,必须使用反引号(`)转义。 通过“branch_<分支名>”或“tag_<标签名>”定位的分支或标签,不可与VERSION AS OF子句同时使用 。

  • 时间旅行查询中的Schema选择

    各类时间旅行查询可根据定位目标的不同,使用快照自身的Schema或当前表的Schema,具体规则如下:

    • 使用当前表的Schema:
      • 示例一:
        SELECT * FROM prod.db.table TIMESTAMP AS OF '1986-10-26 01:21:00';
      • 示例二:
        SELECT * FROM prod.db.table VERSION AS OF 10963874102873;
    • 使用分支自身的Schema:
      • 示例一:
        SELECT * FROM prod.db.table VERSION AS OF 'audit_branch';
      • 示例二:
        SELECT * FROM prod.db.table.branch_audit_branch;
    • 使用标签自身的Schema:
      • 示例一:
        SELECT * FROM prod.db.table VERSION AS OF 'historical_snapshot'; 
      • 示例二:
        SELECT * FROM prod.db.table.tag_historical_snapshot;

相关文档