结构化流查询失败 "A file referenced in the transaction log cannot be found."

Structured Streaming Query Fails with "A file referenced in the transaction log cannot be found."

我正在从 delta table 源进行流式传输,但我的查询一直失败 A file referenced in the transaction log cannot be found。奇怪的是,当我 运行 fsck repair table table_name dry run 查看缺少哪些文件时 returns 没有结果。为什么流式查询会认为事务日志中缺少一个文件,而 fsck 修复却说有 none?

我也试过运行宁:spark._jvm.com.databricks.sql.transaction.tahoe.DeltaLog.clearCache()

这个错误的一些原因和解决方法:

在流作业开始处理之前删除基础数据。为避免这种情况,请在集群的 Spark Config 中将 Spark 属性 spark.sql.files.ignoreMissingFiles 设置为 true,否则您必须使用新的检查点目录。

交易文件未使用最新详细信息进行更新,您仍然使用增量 table 执行更新。为了克服这个问题,您可以在数据加载完成后刷新 table。要使用最新的详细信息更新交易文件,您还可以 运行 fsck

fsck removes any file entries that cannot be found in the underlying file system from the transaction log of a Delta table.

参考:A file referenced in the transaction log cannot be found

问题最终是 tables 正在被优化然后清理,然后流作业试图读取事务日志但文件已被清理。解决方法是将真空保留增加到大于最新从流中读取的值。 fsck 不起作用的原因是,从 table.

的最新状态来看,文件实际上并没有丢失。