如何用Pandas读取S3目录下所有Parquet文件?遇报错求解
问题:Pandas读取S3目录下Parquet文件抛出FileNotFoundError
根据Pandas官方文档描述,read_parquet支持传入目录路径(如s3://bucket/partition_dir)读取目录下所有Parquet文件,但执行以下代码时却报错FileNotFoundError:
pd.read_parquet(f"s3://my-bucket/data", columns=columns, storage_options=get_aws_creds_dict())
请问忽略了什么?如何将目录下所有Parquet文件读取为单个DataFrame?
解决方法
检查目录文件结构
确认s3://my-bucket/data目录下存在直接可读取的Parquet文件(后缀为.parquet/.snappy.parquet等)。如果目录下仅包含分区子目录(如year=2023/month=10/),需确保目录命名符合Parquet分区规范(列名=值格式),Pandas会自动识别分区结构;若目录为多层非分区嵌套,建议用pyarrow.dataset方式读取(见下文)。验证AWS凭证权限
确保get_aws_creds_dict()返回的凭证具备目标S3桶及目录的读取权限,包括:s3:ListBucket:允许列出目录下的对象s3:GetObject:允许读取Parquet文件
可通过AWS CLI命令验证:aws s3 ls s3://my-bucket/data,若能正常列出文件则权限无问题。
指定读取引擎
Pandas默认自动选择引擎(auto),不同引擎(pyarrow/fastparquet)对S3目录的处理逻辑存在差异。建议显式指定pyarrow引擎尝试:pd.read_parquet(f"s3://my-bucket/data", columns=columns, storage_options=get_aws_creds_dict(), engine="pyarrow")处理复杂目录结构
若目录为多层嵌套或非标准分区结构,可借助pyarrow.dataset构建数据集后转成DataFrame:import pyarrow.dataset as ds from pyarrow import fs # 初始化S3文件系统 s3_fs = fs.S3FileSystem(**get_aws_creds_dict()) # 构建Parquet数据集 dataset = ds.dataset("s3://my-bucket/data", format="parquet", filesystem=s3_fs) # 读取指定列并转成Pandas DataFrame df = dataset.to_table(columns=columns).to_pandas()
内容的提问来源于stack exchange,提问作者nirkov
相关产品推荐
相关产品推荐

