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

