DeltaLake:如何跨数据集进行无限时间旅行?
DeltaLake: How to Time Travel infinitely across Datasets?
用例:
- 存储大型数据集(CSV/Snowflake 表)的版本并跨版本查询
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))
用例:
- 存储大型数据集(CSV/Snowflake 表)的版本并跨版本查询
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))