如何用Polars实现单次读取大Parquet文件的多分区发散查询下沉?
解决方案:一次性扫描大文件并按token分区写入
你当前的循环写法会对每个token重复扫描整个大文件,IO开销拉满,性能浪费严重。Polars原生就支持一次扫描、流式处理、分区写入的方案,完全适配你的大文件+LazyFrame场景,不需要把全量数据载入内存。
最优实现代码
import polars as pl # 以Lazy模式读取大文件(不加载到内存) data = pl.scan_parquet(big_file_path) # 如果你只需要处理指定的tokens列表,先过滤出目标数据(可选步骤) data = data.filter(pl.col("token").is_in(tokens)) # 按token列自动分区写入,全程仅扫描一次文件 data.sink_parquet( output_root_path, partition_by="token", # 可选:根据需求调整写入参数,比如压缩格式、行组大小 compression="snappy", row_group_size=100_000 )
关键说明
- 这个写法会流式处理大文件的每一行数据,直接将其路由到对应的
token=xxx子文件夹下,全程内存占用极低,不会加载全量数据。 - 生成的目录结构是标准Parquet分区格式(
output_root_path/token=xxx/xxx.parquet),后续读取时pl.scan_parquet能自动识别分区,无需额外处理。
如果有特殊需求(比如自定义分区路径格式),可以结合group_by做更灵活的处理,但原生partition_by已经是最高效的方案,优先推荐使用。
内容的提问来源于stack exchange,提问作者WillowOfTheBorder
相关产品推荐
相关产品推荐

