从 Pandas 到 Polars 四十三:处理大于内存限制的Parquet文件

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 文件的行为:

  1. path: (str) 输出文件的路径。
  2. compression: (str, optional) 压缩算法,如 'gzip', 'snappy', 'lz4', 'brotli' 等。
  3. use_pyarrow: (bool, optional) 是否使用 PyArrow 来写入 Parquet 文件。默认为False。
  4. row_group_size: (int, optional) 每个行组的大小,以行数为单位。默认为 10000 行。
  5. parallel: (bool, optional) 是否并行写入。默认为True。
  6. 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 表达式“是什么?

从 Pandas 到 Polars 六:在 Polars 中流式处理大型数据集

从 Pandas 到 Polars 0:理解Polars嵌套列类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值