本地模式PySpark将DataFrame写入CSV时报Py4JJavaError如何解决?
问题根因
报错核心原因是Windows系统下PySpark依赖的Hadoop原生二进制组件缺失/版本不匹配,触发NativeIO权限校验失败,Spark写入时仅能创建临时文件夹,最终提交阶段校验不通过会删除临时写入的文件,因此只保留空文件夹。
解决方案
1. 永久修复(适配Windows本地Spark环境)
- 确认你使用的PySpark版本对应的Hadoop版本,下载完全匹配版本的
winutils.exe和hadoop.dll文件 - 将两个文件放入本地Hadoop安装目录的
bin文件夹下,同时额外复制hadoop.dll到C:\Windows\System32系统目录 - 配置系统环境变量:
- 新增
HADOOP_HOME变量,值为你的Hadoop根目录路径,例如C:\hadoop-3.2.0 - 在系统
Path变量中新增%HADOOP_HOME%\bin
- 新增
- 配置完成后完全关闭当前Python运行环境(Jupyter/终端),重启后生效
2. 临时快速修复(适合学习场景)
如果不想配置全套Hadoop环境,可以在启动SparkSession时添加配置关闭NativeIO校验,直接绕过平台适配问题:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .master("local[*]") \ .appName("csv_write_test") \ # 关闭NativeIO权限校验,跳过Windows平台适配限制 .config("spark.hadoop.io.nativeio.enabled", "false") \ .getOrCreate()
3. 修复现有代码的语法错误
你当前的日期筛选条件存在语法问题,日期字符串没有加单引号,会导致SQL执行报错,需要修改为:
days = df1.select('days').where("days BETWEEN '2020-01-01' AND '2020-01-31'").distinct().collect() for day in days: # 给日期值补充单引号,避免SQL语法错误 _df = df1.where(f"days = '{day[0]}'") # 本地小数据量学习场景可以直接转pandas写入,无需处理Spark的文件生成规则 _df.toPandas().to_csv(f"C:/Users/zeyneb ben massoud/Documents/stage/{day[0]}.csv", header=True, index=False)
如果需要保留Spark原生写入逻辑,修改筛选条件后配合上述环境配置即可正常生成文件,Spark原生写入的CSV文件默认命名为part-00000-xxx.csv格式,可根据需求自行重命名。
内容的提问来源于stack exchange,提问作者ZàYneb B'massoud
相关产品推荐
相关产品推荐

