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

Spark读取目录多文本文件失败求助:通配符/目录方式报错

解决Windows 10下Spark无法通过通配符/目录批量读取文本文件的问题

问题场景

Windows 10系统,Python 3.8.5(推测你笔误写成8.5)、Java 8、Anaconda 3环境下,使用Spark读取单个目录中的多份文本文件:

  • 显式指定文件列表的方式(如sc.textFile("data/199901.txt,data/200002.txt"))可正常运行
  • 使用通配符(*.txt、data/*.txt)或直接指定目录(data、C:/spark/HW1/data)的方式全部失败,执行collect()时抛出核心错误:
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

问题根源

这个错误是Hadoop本地IO库在Windows平台的兼容性问题:当Spark需要遍历目录(使用通配符或直接指定目录时会触发目录遍历操作),Hadoop会尝试调用Windows原生API检查文件权限,但缺少对应的原生库文件(winutils.exe、hadoop.dll),或库版本与Spark依赖的Hadoop版本不匹配,导致调用失败。

解决方案

方案1:配置Hadoop Windows原生库

  1. 确认Spark依赖的Hadoop版本:查看Spark安装目录下lib文件夹中hadoop-*.jar的版本号(比如hadoop-2.7.3.jar)
  2. 下载对应版本的Windows原生库(winutils.exe和hadoop.dll)
  3. 新建一个Hadoop目录(比如C:\hadoop),在其中创建bin子目录,把下载的winutils.exe和hadoop.dll放入C:\hadoop\bin
  4. 设置系统环境变量:
    • 添加HADOOP_HOME变量,值为C:\hadoop
    • 将%HADOOP_HOME%\bin添加到系统PATH变量中
  5. 重启命令行或IDE,重新运行Spark代码

方案2:禁用Hadoop原生IO检查

如果不想配置Hadoop环境,可以直接在Spark中禁用原生IO库的使用:

from pyspark import SparkConf, SparkContext

# 初始化Spark配置时禁用原生IO
conf = SparkConf().setAppName("BatchReadFiles").setMaster("local[*]")
conf.set("spark.hadoop.io.native.lib.available", "false")
sc = SparkContext(conf=conf)

# 测试批量读取
files = sc.textFile("C:/spark/HW1/data/*.txt")
llist = files.collect()
for line in llist:
    print(line)

方案3:权限排查

  • 确保运行Spark代码的用户对目标目录C:/spark/HW1/data有读取权限
  • 避免将数据目录放在需要管理员权限的路径(如C盘根目录),或使用管理员身份运行命令行/IDE

验证

完成上述配置后,重新尝试使用通配符或目录路径读取文件,应该可以正常加载RDD并打印内容。

内容的提问来源于stack exchange,提问作者DougW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:10:44