DeltaLake:如何在数据集中无限次旅行?

问题描述

用例:

  • 存储大型数据集的版本(CSV /雪花表)并在各个版本之间进行查询

DeltaLake表示,除非运行真空命令,否则我们将历史信息保留在DeltaTable中。并且日志文件每30天删除一次。 Here

和其他文档指出,我们需要日志文件和DataFiles来进行时间旅行。 here

这是否意味着我们只能旅行30天?

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

如果是,那么可以解决跨数据集版本查询的其他开源版本又是什么?

解决方法

Databricks已于2018年4月开放开源deltalake项目(开源deltalake项目仍在获得一些功能,例如数据跳过等)详细信息:DeltalakeDocsGithub Repo

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

它不会自动删除文件。应该执行真空操作以删除较旧且未引用(未激活)的文件。 因此,无需运行“真空”操作,您就可以无限次穿越时空,因为所有数据都将可用。另一方面,如果您执行保留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))