Time travel使指向特定表快照的查询成为可能,并让用户轻松检查更改。
版本回滚允许用户通过将表重置为良好状态的版本,来快速纠正问题。
我们将检查客户表中Tanya数据的历史记录,并回滚对其记录的删除。
对Iceberg表的每次更改都会创建元数据的独立版本,称为快照。使用以下查询,将看到总共三个快照。
%%sql
SELECT *
FROM ${ICEBERG_DB}.${ICEBERG_CUSTOMER_TABLE}.snapshots
ORDER BY committed_at
上面的查询针对的是snapshots元数据表, 元数据表通过在原始表名后添加元数据表名来标识。
我们可以检查对表执行的操作历史。
spark.sql(f"""
SELECT * FROM {ICEBERG_DB}.{ICEBERG_CUSTOMER_TABLE}.history
ORDER BY made_current_at
"""
).show(truncate=False)
获取最后2个表操作的快照ID,以执行time travel和回滚。
snapshotIDs = spark.sql(f"""
SELECT snapshot_id
FROM {ICEBERG_DB}.{ICEBERG_CUSTOMER_TABLE}.snapshots
ORDER BY committed_at DESC
"""
).collect()
second_snapshot_id = snapshotIDs[1][0]
latest_snapshot_id = snapshotIDs[0][0]
print(f"second_snapshot_id: {second_snapshot_id}")
print(f"latest_snapshot_id: {latest_snapshot_id}")
通过指定快照ID或时间戳来读取特定的表状态, 以下查询执行time travel,回到删除Tonya记录之前的版本:
query = f"""
SELECT * FROM {ICEBERG_DB}.{ICEBERG_CUSTOMER_TABLE} FOR VERSION AS OF {second_snapshot_id} where c_customer_sk = 15
"""
spark.sql(query).show()
time travel允许回到过去,检查表在过去的状态。
Iceberg提供了一种方法,可以回滚更改并使用表的旧快照的snapshot_id将表永久恢复到历史状态。这对于撤销意外删除或数据损坏非常有用。为此,使用CALL
语句并调用Iceberg存储过程rollback_to_snapshot
以回到任何历史提交。
以下查询将表回滚到特定的快照ID,从而恢复Tonya记录的删除。
query = f"""
CALL system.rollback_to_snapshot('{ICEBERG_DB}.{ICEBERG_CUSTOMER_TABLE}', {second_snapshot_id})
"""
spark.sql(query).show()
Tonya的记录回到了表的当前版本中:
%%sql
SELECT * FROM ${ICEBERG_DB}.${ICEBERG_CUSTOMER_TABLE} WHERE c_customer_sk = 15
请注意,每次回滚操作都会生成一个新的元数据文件。但它不会影响数据文件。
show_data_files(ICEBERG_CUSTOMER_TABLE)
一个新的快照版本会附加到历史元数据表的末尾。由于回滚,先前的版本被标记为NOT current ancestor:
%%sql
SELECT * FROM ${ICEBERG_DB}.${ICEBERG_CUSTOMER_TABLE}.history
ORDER BY made_current_at
还可以前滚到表的最后状态(删除操作完成之后那次):
query = f"""
CALL system.set_current_snapshot('{ICEBERG_DB}.{ICEBERG_CUSTOMER_TABLE}', {latest_snapshot_id})
"""
spark.sql(query).show()
注意Tonya的记录再次被删除:
%%sql
SELECT * FROM ${ICEBERG_DB}.${ICEBERG_CUSTOMER_TABLE} WHERE c_customer_sk = 15
第三个快照的is_current_ancestor现在恢复为true:
%%sql
SELECT * FROM ${ICEBERG_DB}.${ICEBERG_CUSTOMER_TABLE}.history
ORDER BY made_current_at
同样,每次回滚操作都会生成一个新的元数据文件(参见元数据文件夹中的json文件),但不会生成新的快照(没有新的manifest list文件或数据文件)。
show_tables_files(ICEBERG_CUSTOMER_TABLE)