Amazon s3 从深层S3路径层次结构中的CSV读取Dask数据帧

Amazon s3 从深层S3路径层次结构中的CSV读取Dask数据帧,amazon-s3,boto3,boto,dask,dask-distributed,Amazon S3,Boto3,Boto,Dask,Dask Distributed,我试图在Dask数据帧中读取S3中的一组CSV。 该bucket具有较深的层次结构,还包含一些元数据文件。 这个电话看起来像 dd.read_csv('s3://mybucket/dataset/*/*/*/*/*/*.csv') 这导致达斯克被吊死。真正的问题是,s3fs.glob挂起,试图解决一个有那么多星星的glob模式。我尝试用一个由boto3.list\u objects计算的显式列表替换glob,但它最多可以返回1000条路径;我还有几个数量级 如何有效地将这组文件指定为dask.

我试图在Dask数据帧中读取S3中的一组CSV。 该bucket具有较深的层次结构,还包含一些元数据文件。 这个电话看起来像

dd.read_csv('s3://mybucket/dataset/*/*/*/*/*/*.csv')
这导致达斯克被吊死。真正的问题是,
s3fs.glob
挂起,试图解决一个有那么多星星的glob模式。我尝试用一个由
boto3.list\u objects
计算的显式列表替换glob,但它最多可以返回1000条路径;我还有几个数量级

如何有效地将这组文件指定为
dask.dataframe.read\u csv

重新定义这个问题的一种方法是:如何有效地获得Python中大型S3存储桶的完整递归列表?这忽略了一种可能性,即存在其他一些基于模式的调用
dask.dataframe.read_csv

,您可以在boto3中使用它来列出bucket中的所有对象。您还可以指定要限制搜索的前缀。文档中给出了此类代码的示例,您可以简单地复制粘贴它并替换bucket名称和前缀

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'])

这是对所提出问题的正确答案;s3fs(在Dask中使用)实际上是在一个目录一个目录地工作。然而,仅仅拥有这么多的文件和级别可能是一种次优模式。@mdurant对于使用dask等进行处理来说,这是次优模式,但这正是我需要处理的数据。