DeltaLake:如何跨数据集进行无限时间旅行?

DeltaLake: How to Time Travel infinitely across Datasets?

用例:

DeltaLake 说,除非我们 运行 vacuum 命令,否则我们会在 DeltaTable 中保留历史信息。日志文件每 30 天删除一次。 Here

附加文档指出我们需要日志文件和数据文件来进行时间旅行。 here

这是否意味着我们只能进行 30 天的时间旅行?

但是 Delta 不是一种文件格式吗?它如何自动删除它的日志?

如果是,还有哪些开源版本可以解决跨数据集版本查询?

Databricks 已于 2018 年 4 月开源 deltalake 项目(开源 deltalake 项目仍有一些功能,如数据跳过等)详情:Deltalake, Docs, Github Repo

Delta 不是文件格式 - 它是镶木地板和元数据(json 格式)文件之上的存储层。

它不会自动删除文件。应执行真空操作以删除较旧且未引用(未激活)的文件。 因此,如果没有 运行 'vacuum' 操作,您可以无限地进行时间旅行,因为所有数据都可用。另一方面,如果您执行 'vacuum' 保留 30 天,您可以访问最近 30 天的数据。

是的,它解决了跨数据集版本的查询。每个版本都可以通过时间戳来标识。访问特定版本数据的示例查询:

斯卡拉:

val df = spark.read
  .format("delta")
  .option("timestampAsOf", "2020-10-01")
  .load("/path/to/my/table")

Python:

df = spark.read \
  .format("delta") \
  .option("timestampAsOf", "2020-10-01") \
  .load("/path/to/my/table")

SQL:

SELECT count(*) FROM my_table TIMESTAMP AS OF "2010-10-01"
SELECT count(*) FROM my_table TIMESTAMP AS OF date_sub(current_date(), 1)
SELECT count(*) FROM my_table TIMESTAMP AS OF "2010-10-01 01:30:00.000"

(注意:我在多个用例的生产中使用开源 deltalake)

只需将数据和日志保留设置设置为很长的时间即可。

alter table delta.`/path/to/table` set TBLPROPERTIES ('delta.logRetentionDuration'='interval 36500000 days', 'delta.deletedFileRetentionDuration'='interval 36500000 days')
spark.sql("alter table delta.`{table_path}` set TBLPROPERTIES ("
                      "'delta.logRetentionDuration'='interval {log_retention_days} days', "
                      "'delta.deletedFileRetentionDuration'='interval {data_rentention_days} days');".format(
                        table_path="path/to/table",
                        log_retention_days=36000000,
                        data_rentention_days=36000000))