如何在Databricks中向ADLS生成单个CSV文件而非目录?
解决PySpark在ADLS生成单个指定文件名CSV的问题
PySpark的分布式特性决定了df.write.csv()默认会将你指定的路径作为目录而非单个文件,这就是你指定sample.txt却得到同名目录的核心原因。即便用coalesce(1)合并分区,也只会在目录内生成单个part-xxxx文件,无法直接输出指定文件名的文件。要实现需求,需分两步操作:
具体步骤
合并分区写入临时目录
先将DataFrame合并为1个分区,写入ADLS的临时目录,确保仅生成单个part文件:# 替换为你的ADLS临时目录路径 temp_path = "abfss://<container-name>@<storage-account>.dfs.core.windows.net/temp_single_csv" # 合并分区并写入临时目录,按需设置header参数 df.coalesce(1).write.mode("overwrite").option("header", "true").csv(temp_path)重命名part文件到目标路径
通过Spark的Hadoop文件系统API找到临时目录中的part文件,将其重命名为目标文件名并移动到指定路径,最后清理临时目录:from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() fs = spark._jvm.org.apache.hadoop.fs.FileSystem.get(spark._jsc.hadoopConfiguration()) # 替换为你的目标文件路径 target_path = "abfss://<container-name>@<storage-account>.dfs.core.windows.net/sample.txt" # 筛选临时目录下的part文件(排除_SUCCESS等无关文件) temp_files = [ f.getPath().toString() for f in fs.listFiles(spark._jvm.org.apache.hadoop.fs.Path(temp_path), False) if "part-" in f.getPath().getName() ] if temp_files: # 重命名并移动文件 fs.rename( spark._jvm.org.apache.hadoop.fs.Path(temp_files[0]), spark._jvm.org.apache.hadoop.fs.Path(target_path) ) # 删除临时目录 fs.delete(spark._jvm.org.apache.hadoop.fs.Path(temp_path), True)
注意事项
- 确保Spark作业拥有ADLS临时目录和目标路径的读写权限。
- 生产环境建议给临时目录添加唯一标识(如时间戳),避免多作业冲突。
coalesce(1)会将所有数据集中到单个Executor节点,数据量过大时可能引发内存压力,需根据数据规模评估适用性。
内容的提问来源于stack exchange,提问作者teknik
相关产品推荐
相关产品推荐

