Pyspark Structured Streaming读Delta表找不到指定版本文件如何处理?
报错含义
这个报错是Delta Lake流式读取的校验失败触发的:Delta表的所有版本变更都记录在表根目录下的_delta_log事务日志目录中,每个版本对应一个独立的JSON日志文件。你的Structured Streaming作业的checkpoint中记录了上次读取处理完成的Delta表版本为920,本次启动需要拉取版本921的日志文件构建对应快照、读取增量数据时,无法找到该版本的日志文件,因此抛出异常。
常见的触发原因包括:
- 对Delta表执行了
VACUUM操作,清理了早于保留期的旧版本事务日志 - 手动误删了
_delta_log目录下的版本921对应日志文件 - 作业运行身份没有版本921日志文件的Azure Data Lake读取权限
- 事务日志文件被其他运维操作移动/重命名
不删除checkpoint、事务日志的解决方案
- 权限问题修复:先登录Azure Portal检查ADLS容器中Delta表
_delta_log目录下的00000000000000000921.json文件是否存在,若存在则校验作业使用的服务主体/托管身份是否有该文件的读取和列出权限,补全权限后重启作业即可。 - 恢复被删除的事务日志:如果确认版本921的日志文件被删除,且ADLS容器开启了软删除功能,直接在ADLS的回收站中恢复该日志文件,恢复完成后重启作业即可正常读取。
- 调整checkpoint偏移量跳过缺失版本:如果日志文件无法恢复,且可以接受缺失版本(921到当前Delta表最早可用版本之间)的数据,找到checkpoint目录下的
offsets子目录,打开最新的偏移量文件,将Delta源对应的已处理版本号修改为Delta表当前存在的最早版本号,保存后重启作业即可。如果不能接受数据丢失,先手动导出缺失版本对应的增量数据写入结果表,再修改偏移量重启作业。 - 参数兼容适配:如果业务可以接受至少一次语义、允许少量重复数据,可以在流读取Delta表的配置中添加
ignoreChanges参数,跳过版本存在性校验,示例代码如下:
delta_stream_df = spark.readStream \ .format("delta") \ .option("ignoreChanges", "true") \ .load("abfss://<容器名>@<存储账户名>.dfs.core.chinacloudapi.cn/<Delta表路径>")
内容的提问来源于stack exchange,提问作者user7454972
相关产品推荐
相关产品推荐

