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
相关产品推荐
相关产品推荐

