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
如果您愿意这样做,也可以使用该命令。请阅读文档了解更多详细信息。
这是一个残酷的解决方案。这并不理想,但考虑到用分区覆盖大型数据集可能会很昂贵,这个简单的解决方案可能会有所帮助。
如果您对所需回滚时间之后的更新不是很敏感,只需删除 _delta_log 中晚于回滚时间的所有版本文件即可。稍后可以使用真空释放未引用的文件。
保留完整历史记录的另一个解决方案是 1) deltaTable.delete
2) 将所有日志按顺序(随着版本号递增)复制到回滚到删除日志文件的末尾。这模仿了回滚日期之前三角洲湖的创建。但它肯定不漂亮。
归档时间: |
|
查看次数: |
4218 次 |
最近记录: |