读取S3拼花地板表的最后N行

2024-09-26 18:12:01 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我应用所讨论的here来读取S3 buck-to-pandas数据帧中的拼花地板文件,特别是:

import pyarrow.parquet as pq
import s3fs
s3 = s3fs.S3FileSystem()

pandas_dataframe = pq.ParquetDataset('s3://your-bucket/', filesystem=s3).read_pandas().to_pandas()

当表随着时间的推移越来越大,我需要定期进行检索时,我只想将最后N行读入数据帧。这可能吗


Tags: 文件to数据importpandasheres3拼花
2条回答

不,仅使用S3是不可能的。S3是一个对象存储,它允许您仅存储、检索、更新“整个”对象,即文件

说到这里,您应该看看Athena,它是一种无服务器查询服务,可以轻松地使用标准SQL分析AmazonS3中存储的大量数据。它应该让你做你想做的事

最好的,Stefan

是的,这是完全可能的。S3允许部分对象读取。拼花地板文件允许基于行组的部分读取(pyarrow公开了此功能)。此外,如果您有多个文件(无论文件格式如何),pyarrow允许部分读取。但是,这些方法会对如何创建输入文件提出一些要求(请参见底部的旁白)

捷径

最简单的方法是使用较新的datasets API(它本身值得一读,并且会废弃您引用的一些问题)并对某种列进行筛选

import pyarrow.dataset as ds
from datetime import datetime, timedelta

two_days_ago = datetime.now() - timedelta(days=2)
dataset = ds.dataset('s3://your-bucket').to_table(filter=ds.field('sample_date') > two_days_ago)

pyarrow数据集API支持“下推过滤器”,这意味着过滤器被下推到读卡器层。如果读卡器能够减少使用过滤器读取的数据量,则它将。对于这样的简单过滤器,拼花地板阅读器能够通过首先查看行组元数据来优化读取,行组元数据应该有一个“统计”部分,其中包含每个列的最小/最大值

然而,这并不完全是“最后N行”,因为它需要您制作某种过滤器。如果您完全控制了数据,那么您可以创建一个row_num列。如果知道行的总数(可以单独存储,也可以通过元数据访问,请参见下文),则可以在此基础上创建一个过滤器

稍微不那么容易的方法

或者,您可以使用具有metadata属性的^{}。访问该文件只会触发对元数据本身(不是整个文件)的读取。从中可以获得一些信息,例如文件中有多少行组以及它们包含多少行。您可以使用它来确定需要多少行组,并且可以使用read_row_groupread_row_groups仅访问这些行组(这不会触发完整的文件读取)

这两种解决方案都不理想。第一个选项要求您对数据有更多的控制,第二个选项要求您自己做大量的工作。Arrow项目正致力于简化此类操作(例如,请参见ARROW-3705)。但是,这个答案仅基于目前可用的功能

最后一点:所有这些方法(甚至是Arrow开发的任何未来方法)都需要将数据存储为多个文件或多个行组。如果您有一个巨大的文件存储为一个单行组,那么就没有什么可以做的了。拼花地板不支持部分行组读取

相关问题 更多 >

    热门问题