Delta Lake 回滚

Fan*_*ang 11 rollback apache-spark databricks delta-lake

需要一种优雅的方式将 Delta Lake 回滚到以前的版本。

我目前的方法如下:

import io.delta.tables._

val deltaTable = DeltaTable.forPath(spark, testFolder)

spark.read.format("delta")
  .option("versionAsOf", 0)
  .load(testFolder)
  .write
  .mode("overwrite")
  .format("delta")
  .save(testFolder)
Run Code Online (Sandbox Code Playgroud)

但这很丑陋,因为需要重写整个数据集。似乎一些元更新就足够了,不需要数据 I/O。有人知道更好的方法吗?

小智 10

从 Delta Lake 0.7.0 开始,您可以使用RESTORE命令回滚到 Delta Lake 表的早期版本。这是使用时间旅行回滚表的更简单的方法。

斯卡拉:

import io.delta.tables._

val deltaTable = DeltaTable.forPath(spark, "/path/to/delta-table")

deltaTable.restoreToVersion(0)
Run Code Online (Sandbox Code Playgroud)

Python:

from delta.tables import *

deltaTable = DeltaTable.forPath(spark, "/path/to/delta-table")

deltaTable.restoreToVersion(0)
Run Code Online (Sandbox Code Playgroud)

SQL

RESTORE TABLE delta.`/path/to/delta-table` TO VERSION AS OF 0

restoreToTimestamp如果您愿意这样做,也可以使用该命令。请阅读文档了解更多详细信息。


Fan*_*ang 4

这是一个残酷的解决方案。这并不理想,但考虑到用分区覆盖大型数据集可能会很昂贵,这个简单的解决方案可能会有所帮助。

如果您对所需回滚时间之后的更新不是很敏感,只需删除 _delta_log 中晚于回滚时间的所有版本文件即可。稍后可以使用真空释放未引用的文件。

保留完整历史记录的另一个解决方案是 1) deltaTable.delete2) 将所有日志按顺序(随着版本号递增)复制到回滚到删除日志文件的末尾。这模仿了回滚日期之前三角洲湖的创建。但它肯定不漂亮。