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
相关产品推荐
相关产品推荐

