从深 S3 路径层次结构中的 CSV 读取 Dask DataFrame
reading a Dask DataFrame from CSVs in a deep S3 path hierarchy
我正在尝试在 Dask DataFrame 中读取 S3 中的一组 CSV。
存储桶具有很深的层次结构,并且还包含一些元数据文件。
电话看起来像
dd.read_csv('s3://mybucket/dataset/*/*/*/*/*/*.csv')
这会导致 Dask 挂起。真正的问题是 s3fs.glob
试图解决具有那么多星星的 glob 模式时挂起。我尝试用 boto3.list_objects
计算的显式列表替换 glob,但这可以 return 最多 1000 条路径;我有更多的数量级。
如何高效地将这组文件指定给dask.dataframe.read_csv
?
重构此问题的一种方法可能是:如何有效地获取 Python 中大型 S3 存储桶的完整递归列表?这忽略了存在其他一些基于模式的调用方式的可能性 dask.dataframe.read_csv
.
您可以在 boto3 中使用 Paginatiors 列出存储桶中的所有对象。您还可以指定要将搜索限制到的前缀。文档中提供了此类代码的示例,您可以简单地复制粘贴它并替换存储桶名称和前缀。
import boto3
client = boto3.client('s3')
paginator = client.get_paginator('list_objects')
operation_parameters = {'Bucket': 'my-bucket',
'Prefix': 'foo/baz'}
page_iterator = paginator.paginate(**operation_parameters)
for page in page_iterator:
print(page['Contents'])
我正在尝试在 Dask DataFrame 中读取 S3 中的一组 CSV。 存储桶具有很深的层次结构,并且还包含一些元数据文件。 电话看起来像
dd.read_csv('s3://mybucket/dataset/*/*/*/*/*/*.csv')
这会导致 Dask 挂起。真正的问题是 s3fs.glob
试图解决具有那么多星星的 glob 模式时挂起。我尝试用 boto3.list_objects
计算的显式列表替换 glob,但这可以 return 最多 1000 条路径;我有更多的数量级。
如何高效地将这组文件指定给dask.dataframe.read_csv
?
重构此问题的一种方法可能是:如何有效地获取 Python 中大型 S3 存储桶的完整递归列表?这忽略了存在其他一些基于模式的调用方式的可能性 dask.dataframe.read_csv
.
您可以在 boto3 中使用 Paginatiors 列出存储桶中的所有对象。您还可以指定要将搜索限制到的前缀。文档中提供了此类代码的示例,您可以简单地复制粘贴它并替换存储桶名称和前缀。
import boto3
client = boto3.client('s3')
paginator = client.get_paginator('list_objects')
operation_parameters = {'Bucket': 'my-bucket',
'Prefix': 'foo/baz'}
page_iterator = paginator.paginate(**operation_parameters)
for page in page_iterator:
print(page['Contents'])