如果我应用所讨论的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:
不,仅使用S3是不可能的。S3是一个对象存储,它允许您仅存储、检索、更新“整个”对象,即文件
说到这里,您应该看看Athena,它是一种无服务器查询服务,可以轻松地使用标准SQL分析AmazonS3中存储的大量数据。它应该让你做你想做的事
最好的,Stefan
是的,这是完全可能的。S3允许部分对象读取。拼花地板文件允许基于行组的部分读取(pyarrow公开了此功能)。此外,如果您有多个文件(无论文件格式如何),pyarrow允许部分读取。但是,这些方法会对如何创建输入文件提出一些要求(请参见底部的旁白)
捷径
最简单的方法是使用较新的datasets API(它本身值得一读,并且会废弃您引用的一些问题)并对某种列进行筛选
pyarrow数据集API支持“下推过滤器”,这意味着过滤器被下推到读卡器层。如果读卡器能够减少使用过滤器读取的数据量,则它将。对于这样的简单过滤器,拼花地板阅读器能够通过首先查看行组元数据来优化读取,行组元数据应该有一个“统计”部分,其中包含每个列的最小/最大值
然而,这并不完全是“最后N行”,因为它需要您制作某种过滤器。如果您完全控制了数据,那么您可以创建一个
row_num
列。如果知道行的总数(可以单独存储,也可以通过元数据访问,请参见下文),则可以在此基础上创建一个过滤器稍微不那么容易的方法
或者,您可以使用具有} 。访问该文件只会触发对元数据本身(不是整个文件)的读取。从中可以获得一些信息,例如文件中有多少行组以及它们包含多少行。您可以使用它来确定需要多少行组,并且可以使用
metadata
属性的^{read_row_group
或read_row_groups
仅访问这些行组(这不会触发完整的文件读取)这两种解决方案都不理想。第一个选项要求您对数据有更多的控制,第二个选项要求您自己做大量的工作。Arrow项目正致力于简化此类操作(例如,请参见ARROW-3705)。但是,这个答案仅基于目前可用的功能
最后一点:所有这些方法(甚至是Arrow开发的任何未来方法)都需要将数据存储为多个文件或多个行组。如果您有一个巨大的文件存储为一个单行组,那么就没有什么可以做的了。拼花地板不支持部分行组读取
相关问题 更多 >
编程相关推荐