使用pq.ParquetDataset读取AWS路径报FileNotFoundError求助
AWS认证机制不匹配:Spark通常会自动适配环境中的AWS认证(比如读取
~/.aws/credentials配置、EC2实例IAM角色、EMR集群权限),但PyArrow不会自动继承这些配置。如果你的PyArrow运行环境没设置AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY环境变量,或者使用的IAM角色权限和Spark不一致,就会因权限不足触发文件找不到的错误。路径格式解析差异:Spark兼容
s3://、s3a://、s3n://等多种S3路径前缀,但PyArrow对路径格式的要求更严格。比如你用了s3a://bucket/path这种格式,PyArrow可能无法正确识别,需要换成标准的s3://格式,或者显式指定S3文件系统:import pyarrow.parquet as pq from pyarrow.fs import S3FileSystem fs = S3FileSystem(access_key="your_key", secret_key="your_secret") dataset = pq.ParquetDataset("bucket/path", filesystem=fs) df = dataset.read_pandas()分区与元文件处理逻辑不同:Spark会自动忽略Parquet路径下的
_SUCCESS等元文件,且能兼容Spark风格的分区目录命名;但PyArrow的ParquetDataset默认会扫描路径下所有文件,如果遇到这些Spark生成的特殊文件,或者分区目录命名不符合PyArrow的预期,就可能触发找不到有效Parquet文件的错误。依赖缺失或版本问题:PyArrow读取S3上的Parquet需要依赖
s3fs库,如果没安装(pip install s3fs)会导致无法连接S3;另外旧版本的PyArrow对S3的支持存在bug,升级到较新版本(比如>=10.0.0)可能解决问题。容错机制差异:Spark对缺失文件、空分区有一定容错能力,会自动跳过这些情况;但PyArrow会严格校验每个文件的存在性和可访问性,只要路径下有某个文件无法读取(比如权限不足、文件损坏),就会直接抛出
FileNotFoundError。
内容的提问来源于stack exchange,提问作者user14269252

