添加新分区的 Databricks Delta 文件导致旧分区不可读

Posted

技术标签:

【中文标题】添加新分区的 Databricks Delta 文件导致旧分区不可读【英文标题】:Databricks Delta files adding new partition causes old ones to be not readable 【发布时间】:2021-03-05 21:49:03 【问题描述】:

我有一个笔记本,我正在使用它来加载历史记录。每次加载 6 个月的数据,从 2018-10-01 开始。 我的 delta 文件按 calendar_date 分区

初始加载后,我可以读取增量文件并查看数据。

但是在日期2019-01-01 to 2019-06-30 的第二次加载之后,之前的分区没有使用增量格式正常加载。

像这样读取我的源增量文件会引发错误提示

file dosen't exist

game_refined_start = (
    spark.read.format("delta").load("s3://game_events/refined/game_session_start/calendar_date=2018-10-04/")
)

但是,像下面这样的阅读方式可以很好地了解可能出现的问题

spark.conf.set("spark.databricks.delta.formatCheck.enabled", "false")
game_refined_start = (
    spark.read.format("parquet").load("s3://game_events/refined/game_session_start/calendar_date=2018-10-04/")
)

【问题讨论】:

第二批加载的时候用了什么模式? 它的“覆盖” 【参考方案1】:

如果使用覆盖模式,那么它会完全替换以前的数据。您通过 parquet 看到旧数据,因为 delta 不会立即删除旧版本(但如果您使用 parquet,那么它将立即删除数据)。

要解决您的问题 - 您需要使用附加模式。如果您需要获取以前的数据,您可以从表中读取特定版本,并附加它。像这样的:

path = "s3://game_events/refined/game_session_start/"
v = spark.sql(f"DESCRIBE HISTORY delta.`path` limit 2")
version = v.take(2)[1][0]
df = spark.read.format("delta").option("versionAsOf", version).load(path)
df.write.mode("append").save(path)

【讨论】:

以上是关于添加新分区的 Databricks Delta 文件导致旧分区不可读的主要内容,如果未能解决你的问题,请参考以下文章

过滤与分区列相关的列时的 Databricks 查询性能

在 delta Lake 中高效读取/转换分区数据

Databricks 正在“更新 Delta 表的状态”

databricks delta 格式文件无法读取

如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表

使用 SSMS 从 Delta Lake Databricks 进行突触查询