Spark DataFrame调用write.csv()后如何获取生成的目标CSV文件名
PySpark写入CSV后获取生成文件名称的方法
当然有办法获取生成的CSV文件名,Spark本身不会直接返回写入的文件名,你可以通过遍历输出目录的方式筛选目标文件,以下是两种常用的实现方案:
方案1:使用Spark内置的Hadoop FileSystem API(兼容所有存储介质)
这种方法支持本地文件系统、HDFS、S3等所有Spark支持的存储类型,不需要依赖存储介质的本地访问能力:
from pyspark.sql import SparkSession # 原有写入逻辑 spark = SparkSession.builder.appName("get_csv_name").getOrCreate() df = spark.read.parquet(file) df.write.csv('output') # 遍历输出目录获取part文件 sc = spark.sparkContext Path = sc._jvm.org.apache.hadoop.fs.Path fs = sc._jvm.org.apache.hadoop.fs.FileSystem.get(sc._jsc.hadoopConfiguration()) output_dir = Path("output") file_list = fs.listStatus(output_dir) csv_file_names = [] for file_status in file_list: file_name = file_status.getPath().getName() # 匹配Spark生成的CSV分片文件规则 if file_name.startswith("part-") and file_name.endswith(".csv"): csv_file_names.append(file_name) # 打印所有生成的CSV文件名 print(csv_file_names)
方案2:使用Python原生os模块(仅适用于本地文件系统)
如果你的输出目录是当前执行脚本的节点可以直接访问的本地路径,可以直接用Python的文件操作接口遍历:
import os csv_file_names = [ f for f in os.listdir("output") if f.startswith("part-") and f.endswith(".csv") ] print(csv_file_names)
补充说明
- Spark生成的
part-前缀文件数量和写入前DataFrame的分区数一一对应,如果你只需要输出一个CSV文件,可以在写入前执行df = df.coalesce(1)把分区合并为1,这样输出目录里只会有1个符合规则的CSV文件。 - 输出文件名里的随机UUID是Spark为了避免文件重名冲突自动生成的,确实无法提前预知,必须写入完成后遍历目录才能获取。
内容的提问来源于stack exchange,提问作者Michael Kelso
相关产品推荐
相关产品推荐

