Polar扫描s3多部分镶木地板文件



我在s3上有一个多部分分区的镶木地板。每个分区包含多个镶木地板文件。下面的代码缩小到一个分区,该分区可能包含大约30个parquet文件。当我在包含*.parquet通配符的s3地址上使用scan_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()

如果我从s3地址中去掉*.parquet,那么我会得到以下错误。

exceptions.ArrowErrorException: ExternalFormat("File out of specification: A parquet file must containt a header and footer with at least 12 bytes")

从多个文件的用户指南中可以看出,要做到这一点,需要一个循环来创建许多懒惰的dfs,然后将它们组合在一起。

另一种方法是使用scan_ds函数,该函数接受pyarrow数据集对象。

import polars as pl
import s3fs
import pyarrow.dataset as ds
fs = s3fs.S3FileSystem()
# you can also make a file system with anything fsspec supports
# S3FileSystem is just a wrapper for fsspec
s3_loc = "s3://some_bucket/some_parquet/some_partion=123"
myds = ds.dataset(s3_loc, filesystem=fs)
lazy_df = pl.scan_pyarrow_dataset(myds)
cus_count = lazy_df.select(pl.count('customers')).collect()

相关内容