在Azure Databricks中将Spark DataFrame写入指定名称的单个CSV文件
解决DBFS中Spark DataFrame写入指定名称单个CSV文件的问题
需要将Spark DataFrame写入DBFS中指定名称的单个CSV文件,当前代码会生成以part开头的文件并存入文件夹,直接修改路径会报“该路径是目录”错误。
问题根源
Spark的save方法默认会将数据写入目录而非单个文件,即使使用coalesce(1)合并分区,也会在目标目录下生成part前缀的CSV文件及其他辅助文件(如_SUCCESS)。直接将part文件重命名到已存在的目录路径时,会因路径类型不匹配报错。
可行解决方案
以下是修正后的代码,通过简化路径操作、提前清理冲突文件解决问题:
import os import shutil # 目标CSV文件的DBFS路径 target_file = "/dbfs/path/to/csv/file/File.csv" # 临时目录(用于存放Spark生成的part文件) temp_dir = "/dbfs/tmp/temp_single_csv/" # 清理残留的临时目录 if os.path.exists(temp_dir): shutil.rmtree(temp_dir) # 将DataFrame合并为1个分区后写入临时目录 file_string_or_dataframe.coalesce(1).write.format("csv")\ .option("header", True).mode("overwrite").save(temp_dir) # 精准定位临时目录中的part CSV文件(排除_SUCCESS等无关文件) part_csv_files = [f for f in os.listdir(temp_dir) if f.startswith("part-") and f.endswith(".csv")] if not part_csv_files: raise RuntimeError("未找到Spark生成的part CSV文件") source_part_file = os.path.join(temp_dir, part_csv_files[0]) # 提前删除目标文件(避免重命名时因文件已存在报错) if os.path.exists(target_file): os.remove(target_file) # 直接将part文件重命名为目标文件名 os.rename(source_part_file, target_file) # 清理临时目录 shutil.rmtree(temp_dir) print(f"文件已成功写入: {target_file}")
关键修改说明
- 临时目录直接使用完整DBFS路径,避免路径拼接错误
- 明确过滤
part-开头的CSV文件,防止误操作其他辅助文件 - 重命名前删除目标文件,规避文件已存在的冲突
- 省去中间移动步骤,直接将part文件重命名为目标文件,避免目录类型不匹配的错误
内容的提问来源于stack exchange,提问作者Carolina Karoullas
相关产品推荐
相关产品推荐

