чтение Dask DataFrame из CSV в глубокой иерархии путей S3 - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь прочитать набор CSV в S3 в Dask DataFrame. Ведро имеет глубокую иерархию и содержит также несколько файлов метаданных. звонок выглядит как

dd.read_csv('s3://mybucket/dataset/*/*/*/*/*/*.csv')

Это приводит к зависанию Даска. Реальная проблема заключается в том, что s3fs.glob зависает, пытаясь разрешить шаблон с таким большим количеством звезд. Я попытался заменить глобус явным списком, вычисленным как boto3.list_objects, но это может вернуть максимум 1000 путей; У меня на порядки больше.

Как эффективно указать этот набор файлов для dask.dataframe.read_csv?

Один из способов перефразировать этот вопрос может быть следующим: Как мне эффективно получить полный рекурсивный список большого блока S3 в Python? Это игнорирует возможность использования какого-либо другого способа вызова dask.dataframe.read_csv.

на основе шаблонов.

1 Ответ

2 голосов
/ 12 июня 2019

Вы можете использовать Paginatiors в boto3, чтобы перечислить все объекты в вашем ведре.Вы также можете указать, каким префиксом вы хотите ограничить свой поиск.Пример такого кода приведен в документации, вы можете просто скопировать, вставить его и заменить имя и префикс блока.

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