PySpark在Windows环境保存CSV文件时报File not found错误如何解决?
问题根因
- 报错核心原因是Windows系统环境下运行PySpark依赖Hadoop的Windows适配组件
winutils.exe,系统未配置HADOOP_HOME环境变量导致组件无法被调用 - 生成空文件夹是Spark写入文件的默认机制:Spark为分布式计算框架,默认会将输出数据拆分为多个分片存储,因此会先创建指定名称的文件夹,分片数据文件会存储在该文件夹内,报错后写入流程终止,因此仅生成空文件夹
解决方案
第一步:修复HADOOP_HOME未配置报错
有两种实现方式,任选其一即可:
方式一:永久配置系统环境变量
- 下载与当前Spark版本依赖的Hadoop版本匹配的
winutils.exe、hadoop.dll文件 - 本地新建文件夹
C:\hadoop,在文件夹内创建bin子目录,将下载的两个文件放入bin目录中 - 打开系统环境变量配置面板:
- 新建系统变量
HADOOP_HOME,变量值填写C:\hadoop - 编辑系统变量
Path,新增条目%HADOOP_HOME%\bin
- 新建系统变量
- 重启Jupyter Notebook即可生效,若仍识别失败可重启计算机
方式二:代码内临时配置(无需修改系统设置)
在创建SparkSession的代码之前,插入以下配置代码:
import os # 替换为你实际存放hadoop文件夹的路径 os.environ['HADOOP_HOME'] = 'C:/hadoop' os.environ['PATH'] = f"{os.environ['HADOOP_HOME']}/bin;{os.environ['PATH']}"
第二步:调整写入逻辑生成可用CSV
修复环境配置后,若需要直接得到单个CSV文件,可通过coalesce(1)将数据合并为单个分区后再写入,示例代码如下:
# 加option("header", "true")可将DataFrame列名作为CSV首行写入,不需要可删除 df.coalesce(1).write.format("csv").mode("overwrite").option("header", "true").save("filtered_csv_dir")
写入完成后,进入生成的filtered_csv_dir文件夹,找到后缀为.csv的文件,手动重命名为需要的文件名即可使用。
内容的提问来源于stack exchange,提问作者Jack Avante
相关产品推荐
相关产品推荐

