如何使用 pyarrow 从 s3 读取分区的镶木地板文件?

How do I read partitioned parquet files from s3 using pyarrow?

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

为了这个问题,我们称这个桶为bucket。存储桶有一个文件夹,该文件夹具有基于 year/month/day/hour.

的后续分区

因此,如果要访问 .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 按照这个问题的方法:

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

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

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

如果您使用 Kinesis Firehose 将数据保存到 S3 存储桶(例如),您可以使用 prefix 选项覆盖默认的 AWS year/month/day/hour 格式。