如何使用pyarrow从s3中读取分区的实木复合地板文件?

时间:2019-06-13 09:05:56

标签: python amazon-web-services amazon-s3 parquet pyarrow

我正在尝试读取存储在s3存储桶中的分区镶木地板目录。

为解决这个问题,我们将其称为存储桶bucket。该存储桶有一个文件夹,该文件夹具有根据年/月/日/小时的后续分区。

因此,如果要访问.parquet文件,则URL为:

s3://bucket/folder/year/month/day/hour

我试图阅读它,就像处理其他任何镶木地板文件一样。我最近一直在和他们一起工作。但是,到目前为止,我还没有尝试读取分区文件。

我在下面添加了示例代码:

import s3fs
import pandas as pd
import boto3

# Creating an S3 Filesystem (Only required when using S3)

s3 = s3fs.S3FileSystem()
s3_path = "s3://bucket"
directory = 'folder'

# Loading Files (S3)

data = pq.ParquetDataset(f'{s3_path}/{directory}', filesystem = s3).read_pandas().to_pandas()

这是我使用的流程,我知道它适用于常规镶木地板文件。现在,我得到的错误是:

ValueError: Directory name did not appear to be a partition: 2019

我已经尝试进入2019,因为我发现第一级仅以2019作为文件夹,因此它可能会认为它是子目录而不是分区。

然后路径看起来像s3://bucket/folder/2019

但是,这给了我以下类似的错误:

ValueError: Directory name did not appear to be a partition: 05

我还尝试使用fastparquet来解决以下问题:How to read partitioned parquet files from S3 using pyarrow in python

那也不起作用。如果我尝试使用上述问题答案中的all_paths_from_s3打印文件列表,则会给我一个空白列表[]

1 个答案:

答案 0 :(得分:0)

发生这种情况是因为分区路径应如下所示:

  

s3:// bucket / folder / year = 2019 / month = 05 / day = 01

如果您正在使用 Kinesis Firehose 将数据持久保存到S3存储桶中(例如),则可以使用 prefix 选项覆盖默认的AWS 年/月/日/小时格式。