从 Pandas 到 Polars 四十二:在 AWS Lambda 环境中使用 Polars 来处理数据II:PyArrow

在最近的一篇文章中,我展示了如何使用smart_open库在AWS Lambda中使用Polars。然而,在AWS Lambda中与Polars一起工作的方法有很多种。在本文中,我们将探讨如何使用PyArrow与Polars一起工作。

在这个例子中,我们使用了PyArrow的dataset模块。dataset模块具有许多用于管理数据集的有用特性,我希望在未来的文章中探讨这些特性。今天,我们将看到它与Polars如何结合,以便在使用云存储时进行数据传输。

完整示例

在以下示例中,我们对S3中的Parquet文件进行分组。我们在这里给出了完整的示例,然后在下文中更详细地探讨了两个关键步骤。

import polars as pl

import pyarrow.dataset as ds


def lambda_handler(event, context):
    try:
        s3_file_name = event["s3_file_name"]
        url = f"s3://braaannigan/{s3_file_name}"
        s3_dataset = ds.dataset(url)
        df = (
            pl.scan_ds(s3_dataset)
            .groupby("id1")
            .agg(pl.col("v1").mean())
            .collect(streaming=True)
        )

    except Exception as err:
        print(err)

    return df.write_json()

步骤1 - 创建一个数据集对象

我们将S3中的对象URL传递给ds.dataset来创建数据集对象

在这一步中,PyArrow会在S3中找到Parquet文件并获取一些关键信息。请注意,PyArrow在此时会下载文件,因此这并不能避免文件的完整传输。

现在,s3_dataset知道了Parquet文件的模式——即列的数据类型(dtypes)。

有了这个模式,我们就可以在Polars的惰性模式下工作,并应用一些查询优化。

步骤2 - 扫描数据集对象

在第二步中,我们会在Parquet文件上进行分组聚合操作。

        df = (
            pl.scan_ds(s3_dataset)
            .groupby("id1")
            .agg(pl.col("v1").mean())
            .collect(streaming=True)
        )

关键点在于我们在数据集对象上使用了pl.scan_ds。与任何pl.scan_函数一样,这告诉Polars我们正在使用惰性模式。

在惰性模式下,Polars可以应用查询优化。在这个例子中,优化体现在仅从文件中读取id1和v1列。这种优化减少了我们需要从文件中读取的数据量。

     往期热门文章:

从 Pandas 到 Polars 二十六:在Polars中,不要遍历列

从 Pandas 到 Polars 二十三:如果你的数据已经排序,Polars可以为你提供助力

从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望

从 Pandas 到 Polars 十三:流式处理的关键参数

从 Pandas 到 Polars 十:“Polars 表达式“是什么?

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

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

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值