使用Polars读取S3上Hive分区Parquet文件时出现404错误
Polars读取S3上Hive分区Parquet数据报404错误排查
问题背景
使用Polars从S3读取采用Hive分区布局的Parquet数据时,持续收到404 Not Found错误。已通过boto3验证凭证有效,可正常操作同一数据,但Polars的scan_parquet操作无论是否添加分区过滤,均执行失败。
代码示例
import boto3.session import polars from datetime import date session = boto3.session.Session() credentials = session.get_credentials().get_frozen_credentials() storage_options = { "aws_access_key_id": credentials.access_key, "aws_secret_access_key": credentials.secret_key, "region": session.region_name, "session_token": credentials.token, } # 原路径匹配方式 url = "s3://my-example-bucket/staging/extract/contracts/*.parquet" frame = polars.scan_parquet(url, storage_options=storage_options) # 两种失败操作 result = frame.filter(polars.col("record_date") == date(year=2024, month=1, day=1)).collect() # 或直接collect result = frame.collect()
报错信息
polars.exceptions.ComputeError: 'parquet scan' failed The reason: Object at location staging/extract/contracts not found: Client error with status 404 Not Found: No Body:
S3存储结构示例
staging/extract/contracts/record_date=2024-01-01/contracts_0_0_2024-02-15T16:21:51.975005+00:00.parquet
解决方案
修正路径匹配规则:原路径
*.parquet仅匹配contracts目录下的直接文件,无法递归扫描Hive分区子目录。需改为**/*.parquet来匹配所有层级的Parquet文件:url = "s3://my-example-bucket/staging/extract/contracts/**/*.parquet"启用Hive分区解析:Polars默认不会自动识别Hive分区格式,需显式指定
hive_partitioning=True参数,让Polars自动解析分区列(如record_date)并纳入DataFrame结构:frame = polars.scan_parquet( url, storage_options=storage_options, hive_partitioning=True )验证路径与权限:确认S3路径无拼写错误,同时确保凭证对
contracts下所有分区子目录拥有读取权限(boto3能操作不代表Polars使用的权限覆盖所有层级,需检查IAM策略或桶权限)。可选:生成分区元数据:若递归扫描效率较低,可生成Hive兼容的元数据文件(如
_metadata),部分存储系统依赖此类文件快速识别分区,生成后可重新测试扫描操作。
内容的提问来源于stack exchange,提问作者Philip Couling
相关产品推荐
相关产品推荐

