自动加载程序常见问题解答

有关 Databricks 自动加载程序的常见问题。

当文件被追加或覆盖时,自动加载程序是否会再次处理文件?

除非启用 cloudFiles.allowOverwrites,否则文件只会处理一次。 如果文件被追加或覆盖,Azure Databricks 不保证处理的是哪个版本的文件。 在文件通知模式下启用 cloudFiles.allowOverwrites 时,也许保持谨慎,其中自动加载程序可能会通过文件通知和目录列表来识别新文件。 由于文件通知事件时间和文件修改时间之间存在差异,自动加载程序可能会获取两个不同的时间戳,从而引入同一文件两次,即使文件只写入了一次。

通常,Databricks 建议使用自动加载程序仅引入不可变文件,并避免设置 cloudFiles.allowOverwrites。 如果这不能满足你的要求,请联系你的 Azure Databricks 帐户团队。

如果我的数据文件不是连续送达,而是定期送达(例如,一天一次),我是否仍应使用此源,是否有任何好处?

在这种情况下,你可以设置一个 Trigger.AvailableNow(在 Databricks Runtime 10.4 LTS 及更高版本中可用)结构化流作业并计划在预期文件到达时间之后运行。 自动加载程序不但适用于不频繁的更新,也适用于频繁的更新。 即使最终更新非常大,自动加载程序也能够很好地根据输入大小进行缩放。 自动加载程序的高效文件发现技术和架构演变功能使自动加载程序成为增量数据引入的推荐方法。

如果在重启流时更改了检查点位置,会发生什么情况?

检查点位置维护流的重要标识信息。 更改检查点位置实际上意味着已放弃上一个流并启动一个新流。

是否需要事先创建事件通知服务?

不是。 如果你选择文件通知模式并提供所需的权限,自动加载程序可以为你创建文件通知服务。 请参阅什么是自动加载程序文件通知模式?

如何清理自动加载程序创建的事件通知资源?

你可以使用云资源管理器列出和清除资源。 还可以使用云提供商的 UI 或 API 手动删除这些资源。

我可以从同一个存储桶/容器上的不同输入目录运行多个流式查询吗?

可以,前提是这些目录不是父子关系;例如,不能从 prod-logs/prod-logs/usage/ 运行这种查询,因为 /usage/prod-logs 的子目录。

当桶或容器中已存在文件通知时,我是否可以使用此功能?

可以,只要输入目录与现有通知前缀不冲突(例如上面的父子目录)。

自动加载程序如何推理架构?

首次定义数据帧时,自动加载程序会列出源目录,选择最近的 50 GB 数据或 1000 个文件(按文件修改时间),并使用这些文件来推理数据架构。

自动加载程序还通过检查源目录结构来推理分区列,并查找包含 /key=value/ 结构的文件路径。 例如,如果源目录采用了不一致的结构:

base/path/partition=1/date=2020-12-31/file1.json
// inconsistent because date and partition directories are in different orders
base/path/date=2020-12-31/partition=2/file2.json
// inconsistent because the date directory is missing
base/path/partition=3/file3.json

自动加载程序会将分区列推理为空。 使用 cloudFiles.partitionColumns 显式分析目录结构中的列。

当源文件夹为空时,自动加载程序的行为如何?

如果源目录为空,则自动加载程序会要求你提供架构,因为没有任何数据可用于执行推理。

自动加载程序何时推理架构? 它是否会在完成每个微批后自动演变?

首次在代码中定义数据帧时,将推理架构。 在处理每个微批期间,将即时评估架构更改;因此,你无需担心对性能的影响。 当流重启时,它会从架构位置选取已演变的架构并开始执行,而不会产生任何推理开销。

使用自动加载程序架构推理时,数据引入性能会受到哪种影响?

在执行初始架构推理期间,对于极大的源目录,架构推理预期会花费几分钟时间。 除此之外,在流执行期间,性能不应会受到较大的影响。 如果在 Azure Databricks 笔记本中运行代码,则可以看到状态更新,其中会指明自动加载程序何时列出目录用于采样和推理数据架构。

由于出现 bug,某个错误的文件极大地改变了我的架构。 如何回滚架构更改?

请联系 Databricks 支持人员取得帮助。