You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Databricks Auto Loader生成大量异常子目录的原因排查

问题:Databricks Auto Loader写入Delta表时生成大量奇怪子目录的原因?

我正在使用Databricks的Auto Loader功能处理某目录下的JSON文件,并将其保存至另一个子目录的Delta表中。我的代码如下:

transporters = (spark
.readStream
.format("cloudFiles")
.option("cloudFiles.format", "json") 
.option("recursiveFileLookup", "true") 
.schema(transporters_schema)
.load(source_files_path)
.writeStream
.format("delta")
.outputMode("append")
.option("checkpointLocation", auto_loader_checkpoints_path)
.trigger(availableNow=True)
.start(target_table_path)
)

但Delta表中出现了数百个包含Parquet文件的奇怪子目录,结构如下:

01
|___
    part_00001_fsdgwsdg_afafafafa.snappy.parquet
    part_00002_fsdgwsdg_afafafafa.snappy.parquet
    part_00003_fsdgwsdg_afafafafa.snappy.parquet
02
03
0f
0J
0j
0K
0o
0R
...

未预期这些子目录出现,请问其产生原因是什么?


原因解析

这些以哈希前缀命名的子目录是Delta Lake为优化写入性能和并发逻辑自动生成的,具体原因如下:

  • 并发写入的冲突规避:使用availableNow=True触发器时,Auto Loader会并行启动多个任务处理文件批次。Delta Lake为了避免多个写入线程同时操作同一根目录引发冲突,自动生成这类哈希前缀子目录,每个子目录对应一个写入任务的输出文件,以此提升并行写入的稳定性。

  • 无显式分区时的默认文件组织:你的代码中没有通过.partitionBy()指定分区键,Delta Lake会默认采用哈希子目录的方式组织数据文件,避免单目录下堆积过多文件,这有助于后续查询时的文件扫描效率。

  • 自动优化未即时生效:如果未开启Delta Lake的自动合并小文件功能(Auto Optimize),或者流任务完成后合并操作还未触发,这些子目录和小文件会暂时保留。开启Auto Optimize后,后台会自动合并这些小文件,子目录也会被清理。


内容的提问来源于stack exchange,提问作者Aleksandra Angelova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:38:15