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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:30:10