Windows下PySpark写入CSV/Parquet报Py4JJavaError排查
问题根因
报错java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z的核心原因是Windows环境下Hadoop缺少匹配版本的原生IO依赖,你虽然配置了HADOOP_HOME并将bin目录加入系统路径,但存在依赖文件缺失、版本不匹配或加载失败的问题。
注意:df.show()、df.printSchema()属于读操作,不会触发Hadoop原生IO层的Windows本地权限校验逻辑,只有写入本地文件系统时才会调用NativeIO的本地方法,因此会出现读操作正常、写操作报错的现象。
分步解决方法
- 确认Hadoop版本匹配
先执行代码查询当前PySpark绑定的Hadoop大版本,避免下错依赖:
拿到版本号后,找对应大版本的from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() print(spark.sparkContext._jvm.org.apache.hadoop.util.VersionInfo.getVersion())winutils.exe、hadoop.dll两个核心文件,禁止跨大版本混用(比如Hadoop3.3.x不能用Hadoop2.7的依赖)。 - 部署依赖文件
把下载好的winutils.exe、hadoop.dll直接放到%HADOOP_HOME%\bin目录根路径下,不要嵌套子文件夹。额外复制一份hadoop.dll放到C:\Windows\System32目录,避免系统加载dll时路径检索失败。 - 初始化临时目录权限
手动在C盘创建C:\tmp\hive目录,之后以管理员身份打开命令提示符,执行命令完成权限配置:%HADOOP_HOME%\bin\winutils.exe chmod 777 /tmp/hive - 重启环境验证
完全关闭当前运行的PySpark进程、Python IDE(环境变量和dll加载不会在运行中的进程热更新),重新启动后执行写入代码即可。
常见避坑说明
- 如果部署完依赖还是报dll加载失败,直接安装最新版Microsoft Visual C++ Redistributable运行库,多数精简版Windows缺少该公共依赖会导致
hadoop.dll无法正常加载。 - 写入文件时如果目标路径已经存在也会触发报错,写入时可以指定overwrite模式,避免路径冲突:
df.write.mode("overwrite").csv('test.csv', header=True) df.write.mode("overwrite").parquet('test.parquet') - 不要使用存放在含中文、空格路径下的HADOOP_HOME,Windows原生IO接口对特殊路径的兼容性很差,很容易触发加载失败。
内容的提问来源于stack exchange,提问作者CodeLearner
相关产品推荐
相关产品推荐

