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

Polars扫描S3单分区多Parquet文件仅识别首文件,如何解决?

解决Polars读取S3分区下所有Parquet文件的问题

问题分析

  • 使用*.parquet通配符时,Polars仅读取分区内第一个Parquet文件,无法遍历所有文件
  • 去掉通配符直接指向目录时,因Polars尝试读取目录本身(非Parquet文件),触发ArrowErrorException错误

解决方案

方法1:通过glob参数指定匹配规则

直接传入分区目录路径,用glob参数明确匹配该目录下所有Parquet文件,Polars会自动遍历读取:

import polars as pl

s3_loc = "s3://some_bucket/some_parquet/some_partion=123/"
df = pl.scan_parquet(s3_loc, glob="*.parquet")
cus_count = df.select(pl.count('customers')).collect()

方法2:调整glob路径写法

使用递归匹配符**确保Polars识别到分区下所有同级Parquet文件:

import polars as pl

s3_loc = "s3://some_bucket/some_parquet/some_partion=123/**/*.parquet"
df = pl.scan_parquet(s3_loc)
cus_count = df.select(pl.count('customers')).collect()

方法3:手动列举S3文件再读取

借助s3fs库先列出分区下所有Parquet文件路径,再批量传入scan_parquet:

import polars as pl
import s3fs

fs = s3fs.S3FileSystem()
file_paths = [f"s3://{path}" for path in fs.glob("some_bucket/some_parquet/some_partion=123/*.parquet")]
df = pl.scan_parquet(file_paths)
cus_count = df.select(pl.count('customers')).collect()

错误原因说明

去掉*.parquet后,Polars会将目录路径当作单个文件尝试读取,但S3目录本身并非合法的Parquet文件(缺少Parquet必需的头部和尾部结构),因此抛出格式错误。

内容的提问来源于stack exchange,提问作者yoyoyoyo123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:30:52