从 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嵌套列类型
原文地址:https://blog.csdn.net/sosogod/article/details/140812420
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!