我在 s3 上有一个多部分分区的镶木地板。每个分区包含多个 parquet 文件。下面的代码缩小了单个分区的范围,该分区可能包含大约 30 个 parquet 文件。当我使用scan_parquet
在 s3 地址上,包括*.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()
如果我离开*.parquet
从 s3 地址,然后我收到以下错误。
exceptions.ArrowErrorException: ExternalFormat("File out of specification: A parquet file must containt a header and footer with at least 12 bytes")
看起来像是从用户指南 https://pola-rs.github.io/polars-book/user-guide/multiple_files/intro.html在多个文件上,这样做需要一个循环创建许多惰性 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)