同路径CSV文件PySpark可正常读取 但Pandas读取时报FileNotFoundError
问题原因
核心原因是Spark和Pandas默认读取的文件系统不一致:
- Spark在分布式集群环境下默认寻址HDFS(分布式文件系统),你所用的
/tmp/cs/data_train/cs_subsprofile.csv路径实际存放在HDFS上,Spark可以直接识别访问。 - Pandas的
read_csv默认只读取当前代码运行节点的本地文件系统路径,无法直接访问HDFS上的文件,因此会抛出文件不存在的错误。 - 少数场景下如果是单节点运行,也可能是运行Pandas进程的用户没有对应路径的读取权限,或者文件实际存放在其他节点的本地磁盘,当前节点没有该文件。
解决方案
可根据你的使用场景选择以下方案:
- 数据量不大(小于Driver节点可用内存)时,直接将Spark读取的DataFrame转为Pandas对象即可,无需重复读文件:
# 先用Spark读取文件后直接转Pandas fd_subsprofile = spark.read.csv('/tmp/cs/data_train/cs_subsprofile.csv', header = True) data = fd_subsprofile.toPandas()
- 需要直接读HDFS文件时,可借助HDFS客户端工具先把文件拉到本地再读取:
先执行shell命令拉取文件:hdfs dfs -get /tmp/cs/data_train/cs_subsprofile.csv ./local_subsprofile.csv
再用Pandas读本地文件:
data = pd.read_csv('./local_subsprofile.csv')
- 不想落地本地文件的话,也可以用Python HDFS依赖直接读取HDFS文件流传给Pandas:
from hdfs import InsecureClient import pandas as pd # 替换为你集群的namenode地址和用户名 hdfs_client = InsecureClient('http://namenode_host:50070', user='hdfs_user') with hdfs_client.read('/tmp/cs/data_train/cs_subsprofile.csv') as f: data = pd.read_csv(f)
- 如果你是本地单节点运行Spark,确认文件存放在本地磁盘的话,检查路径拼写、大小写,以及运行Python进程的用户是否有该路径的读取权限即可。
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

