如何使用 awswrangler 只读取 S3 中存储的 parquet 文件的前几行 N 行?

问题描述 投票:0回答:2

我正在尝试使用 awswrangler 将存储在 S3 中的任意大的镶木地板文件读入 pandas 数据帧,但由于文件的大小(以及我的带宽较差),我的查询仅限于前

N
行。

我不知道如何做到这一点,或者是否可以在不搬迁的情况下实现。

我可以使用

chunked=INTEGER
并在读取第一个块后中止吗?如果是这样怎么办?

我遇到过这个不完整的解决方案(最后 N 行;))使用 pyarrow - 读取 S3 parquet 表的最后 N 行 - 但是基于时间的过滤器对我来说并不理想,并且接受的解决方案甚至没有得到到故事的结尾(虽然很有帮助)。

或者有没有其他方法无需先下载文件(我现在可能已经完成了)?

谢谢!

pandas dataframe amazon-s3 pyarrow aws-data-wrangler
2个回答
4
投票

您可以使用 awswrangler 使用 S3 Select 来完成此操作。例如:

import awswrangler as wr

df = wr.s3.select_query(
        sql="SELECT * FROM s3object s limit 5",
        path="s3://amazon-reviews-pds/parquet/product_category=Gift_Card/part-00000-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet",
        input_serialization="Parquet",
        input_serialization_params={},
        use_threads=True,
)

仅从 S3 对象返回 5 行。

这对于其他读取方法是不可能的,因为在读取之前必须将整个对象拉到本地。使用 S3 select,过滤是在服务器端完成的


0
投票

以防万一您在 s3 select 中遇到 OverMaxParquetBlockSize 错误..

我可以使用 chunked=INTEGER 并在读取第一个块后中止吗?如果是这样怎么办?

是的,您可以使用“return”或“raise StopIteration”(如果使用 Python 3.7 之前的版本)来终止生成器

例如:

    dataframes = wr.s3.read_parquet(
            path=file_path, chunked=5, boto3_session=boto3_session
        )
        chunk_counter = 0
        for dataframe in dataframes:
            if chunk_counter == 1:
               return # Terminate the generator
            chunk_counter = chunk_counter + 1
            yield dataframe
© www.soinside.com 2019 - 2024. All rights reserved.