You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:41:11