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

本地模式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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:06:06