时间旅行
前提条件
在Spark中使用Iceberg前,需先配置Spark目录,spark_catalog和prod目录配置请参见Iceberg Catalog配置。Iceberg基于Apache Spark的DataSourceV2 API实现数据源和目录功能。
基本语法
- SQL命令
Spark 3.3及之后版本支持在SQL查询中使用TIMESTAMP AS OF或VERSION 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 OF和FOR SYSTEM_VERSION AS OF语法,功能与TIMESTAMP AS OF和VERSION 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子句同时使用 。
- 时间旅行至1986年10月26日01:21:00:
- 时间旅行查询中的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;
- 示例一:
- 使用当前表的Schema: