Windows环境下PySpark读取文本文件触发AnalysisException:路径自动添加file:/前缀的原因及解决方法
PySpark读取Windows本地文件时AnalysisException问题解析及解决办法
最近在Windows上用PySpark读取文本文件时碰到了AnalysisException,错误提示路径不存在还自动带上了file:/前缀?我来帮你拆解下问题原因和解决办法。
问题重现
报错信息如下:
Error: AnalysisException: Path does not exist: file:/D:/sk - Add/Main/2020/Main_2012-01.txt
对应的三个代码场景:
Code1(执行报错)
for i in os.listdir(): if j.endswith('.txt'): print(i) df= spark.read.text(i)
Code2(同样报错)
path=r"D:\sk - Add\Main\2020" for i in os.listdir(): if j.endswith('.txt'): print(i) df= spark.read.text(path+'\\'+i)
Code3(无报错)
df1=spark.read.text(r'D:\sk - Add\Main\2020\Main_2020-12.txt')
为什么前两种场景会报错?
其实不是PySpark"自动添加"了file:/前缀,而是路径解析规则的问题:
Code1的核心问题
os.listdir()不带参数时,读取的是当前工作目录的文件列表,返回的只是文件名(比如Main_2012-01.txt),不是完整路径。当你把这个文件名传给spark.read.text()时,PySpark会把它当作相对路径,自动拼接Spark默认文件系统的前缀(也就是file:/),但这个相对路径在Spark的文件系统视角下找不到对应文件,自然报错。Code2的双重错误
- 首先是变量名写错了:循环里用了未定义的
j,应该是i.endswith('.txt'); - 其次,
os.listdir()默认读的是当前工作目录的文件,而你指定的path是另一个目录,所以i大概率不是path下的文件,拼接出来的路径本身就不存在,PySpark解析后同样会带上file:/前缀并报错。
- 首先是变量名写错了:循环里用了未定义的
Code3能正常运行的原因
你用了**原始字符串(r前缀)**传入了完整的绝对路径,PySpark能直接识别这个Windows本地绝对路径,不需要拼接默认前缀,自然能找到文件。
解决办法
关键是要确保传给spark.read.text()的是完整的绝对路径,同时修正代码中的错误:
方案1:正确遍历目标目录生成完整路径
import os target_path = r"D:\sk - Add\Main\2020" # 遍历目标目录下的所有文件 for filename in os.listdir(target_path): if filename.endswith('.txt'): print(filename) # 用os.path.join自动拼接路径,适配Windows分隔符 full_file_path = os.path.join(target_path, filename) df = spark.read.text(full_file_path) # 这里可以加上对df的处理逻辑...
方案2:直接读取目录下所有txt文件(更高效)
如果目标目录下的所有txt文件都需要读取,没必要逐个遍历,直接让PySpark读取整个目录的匹配文件:
target_path = r"D:\sk - Add\Main\2020" # 读取目录下所有txt文件 df = spark.read.text(os.path.join(target_path, "*.txt"))
这种方式更简洁,还能避免循环中的路径拼接错误。
额外小贴士
- 确保运行PySpark的用户对目标目录有读取权限;
- 路径中的空格不需要额外转义,用原始字符串(r前缀)或者双引号包裹即可;
- 碰到路径问题时,先打印出拼接后的完整路径,确认路径正确再传给Spark,能快速排查问题。
内容的提问来源于stack exchange,提问作者sachin kumar s
相关产品推荐
相关产品推荐

