
# 时间旅行
#### 前提条件
在Spark中使用Iceberg前，需先配置Spark目录，spark_catalog和prod目录配置请参见[Iceberg Catalog配置](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_300918.html#mrs_01_300918)。Iceberg基于Apache Spark的DataSourceV2 API实现数据源和目录功能。
#### 基本语法
- SQL命令 Spark 3.3及之后版本支持在SQL查询中使用**T** **IMESTAMP AS OF** 或**VERSION AS OF** 子句实现时间旅行。其中，**VERSION AS OF**子句可接受长整数类型的快照 ID，或字符串类型的分支/标签名称。各类时间旅行查询根据定位目标的不同，可使用当前表的Schema、当前分支的Schema或当前标签的Schema。
  - 时间旅行至2026年6月30日01:21:00，查询该时间戳之前的第一个快照：
    ```
    SELECT * FROM prod.db.table TIMESTAMP AS OF '2026-6-30 01:21:00';
    ```
    
  
  - 时间旅行至快照ID 10963874102873，查询该快照ID之前的第一个快照：
    ```
    SELECT * FROM prod.db.table VERSION AS OF 10963874102873;
    ```
    
  
  - 时间旅行至分支"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 OF** 和**FOR SYSTEM_VERSION AS OF** 语法，功能与**T** **IMESTAMP AS OF** 和**VERSION AS OF**一致，例如：
  - 示例一：
    ```
    SELECT * FROM prod.db.table FOR SYSTEM_TIME AS OF '2026-6-30 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**子句同时使用。
  
 
