Parquet 是一种列式存储格式,广泛应用于大数据处理领域,因为它能够高效地存储和查询数据。
Polars现在允许您写入Parquet文件,即使文件过大而无法装入内存。它通过使用流式处理将数据分批处理,然后使用 sink_parquet 的方法将这些批次写入Parquet文件。
流式处理
近几个月来,Polars增加了一种流式处理方法,其中大于内存的数据集可以按批次处理以使其适应内存。我甚至曾经在一个不太强大的笔记本电脑上处理了一个30Gb的数据集。
写入(Sinking)
然而,流式处理的一个限制是查询的输出必须作为DataFrame装入内存。
现在,Polars具有sink_parquet方法,这意味着您可以将流式查询的输出写入Parquet文件。这意味着即使您的查询输出不适合内存,您也可以在笔记本电脑上处理大型数据集。
在这个例子中,我们以惰性模式处理一个大型Parquet文件,并使用sink_parquet将输出写入另一个Parquet文件。
import polars as pl
(
pl.scan_parquet(large_parquet_file_path)
.groupby("passenger_count")
.agg(
pl.col("tip_amount")
)
.sink_parquet(output_parquet_file_path)
)
与普通的惰性查询不同,我们通过调用sink_parquet而不是collect来评估查询并写入输出。
sink_parquet 方法有几个可选参数,以控制写入 Parquet 文件的行为:
- path: (str) 输出文件的路径。
- compression: (str, optional) 压缩算法,如 'gzip', 'snappy', 'lz4', 'brotli' 等。
- use_pyarrow: (bool, optional) 是否使用 PyArrow 来写入 Parquet 文件。默认为False。
- row_group_size: (int, optional) 每个行组的大小,以行数为单位。默认为 10000 行。
- parallel: (bool, optional) 是否并行写入。默认为True。
- append: (bool, optional) 如果文件已经存在,是否追加数据。默认为False。
CSV文件转换
sink_parquet的一个很好的用例是将一个或多个大型CSV文件转换为Parquet格式,这样处理数据会更快。手动执行此过程可能既繁琐又耗时,但使用Polars,我们可以按照以下步骤操作:
(
pl.scan_csv("*.csv")
.sink_parquet(output_parquet_file_path)
)
需要注意的是,Polars的流式处理并非适用于所有操作,因此如果您的查询不支持流式处理,您可能会遇到内存溢出异常。
往期热门文章:
从 Pandas 到 Polars 二十六:在Polars中,不要遍历列
从 Pandas 到 Polars 二十三:如果你的数据已经排序,Polars可以为你提供助力
从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望
从 Pandas 到 Polars 十三:流式处理的关键参数
从 Pandas 到 Polars 十:“Polars 表达式“是什么?