问题描述
用例:
- 存储大型数据集的版本(CSV /雪花表)并在各个版本之间进行查询
DeltaLake表示,除非运行真空命令,否则我们将历史信息保留在DeltaTable中。并且日志文件每30天删除一次。 Here
和其他文档指出,我们需要日志文件和DataFiles来进行时间旅行。 here
这是否意味着我们只能旅行30天?
如果是,那么可以解决跨数据集版本查询的其他开源版本又是什么?
解决方法
Databricks已于2018年4月开放开源deltalake项目(开源deltalake项目仍在获得一些功能,例如数据跳过等)详细信息:Deltalake,Docs,Github 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))