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

如何在Databricks中保存DataFrame时避免生成冗余子文件夹?

解决Databricks保存Delta格式时生成多余子文件夹的问题

问题原因

Delta Lake是基于目录的存储格式,它会将数据、事务日志等文件统一存储在你指定的目录下,而非生成单个独立文件。你在保存路径中指定了.snappy.parquet后缀,Delta会将这个带后缀的路径当作目录名,因此会在该目录下生成数据文件,导致出现my_path/filename.snappy.parquet/filename.snappy.parquet的嵌套结构。

解决方案

根据实际需求选择对应方案:

1. 继续使用Delta格式(推荐,保留ACID事务等特性)

去掉路径中的.snappy.parquet后缀,直接指定目录名,Delta会自动在该目录下管理所有相关文件:

df.write.format("delta").save("abfss://my_container@my_storage.dfs.core.windows.net/my_path/my_delta_table")

后续读取数据时,直接使用这个目录路径即可,Spark会自动识别Delta表结构。

2. 生成单个Parquet文件(不需要Delta特性)

如果你只需要单个.snappy.parquet文件,需改用Parquet格式保存,并通过合并分区+重命名的方式实现:

# 先将DataFrame合并为1个分区,确保只生成一个parquet文件
df.coalesce(1).write.mode("overwrite").parquet("abfss://my_container@my_storage.dfs.core.windows.net/my_path/temp_dir")

# 找到临时目录下的parquet文件并重命名到目标路径
files = dbutils.fs.ls("abfss://my_container@my_storage.dfs.core.windows.net/my_path/temp_dir")
parquet_file = next(f.path for f in files if f.path.endswith(".snappy.parquet"))
dbutils.fs.mv(parquet_file, "abfss://my_container@my_storage.dfs.core.windows.net/my_path/filename.snappy.parquet")

# 删除临时目录
dbutils.fs.rm("abfss://my_container@my_storage.dfs.core.windows.net/my_path/temp_dir", recurse=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 07:09:58