Python 3: Как загрузить несколько CSV в AWS S3 в фрейм данных Pandas?

#python

#python

Вопрос:

Я работаю над ноутбуком AWS EMR, подключенным к кластеру EMR. Обычно я привык работать в Scala и загружать каталоги AWS S3 с тысячами CSV в фрейм данных Spark. Однако я не могу эмулировать тот же подход, используя Python 3.

У меня есть как минимум тысяча csv таких файлов:

 s3://dir/part-00000-d27fd1c5-96d0-431c-88d8-4b216fe008d5-c000.csv
s3://dir/part-00001-d27fd1c5-96d0-431c-88d8-4b216fe008d5-c000.csv
...
s3://dir/part-12345-...
 

Я попробовал каждый из этих трех подходов, где каждый подход разделяется новой строкой:

 df = pd.concat(map(pd.read_csv, glob.glob('s3://dir/*.csv')))

df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('', "s3://dir/*.csv"))))

path = r's3://dir'                     # use your path
all_files = glob.glob(os.path.join(path, "*.csv"))     # advisable to use os.path.join as this makes concatenation OS independent
df_from_each_file = (pd.read_csv(f) for f in all_files)
concatenated_df   = pd.concat(df_from_each_file, ignore_index=True)
 

каждый выдает ошибку: ValueError: No objects to concatenate

Советы по устранению неполадок

В случае последнего решения я замечаю, что all_files это пустой список:

 path = r's3://dir'                     # use your path
all_files = glob.glob(os.path.join(path, "*.csv"))     # advisable to use os.path.join as this makes concatenation OS independent
all_files
[]
 

Кроме того, я попытался:

 os.listdir(path)
FileNotFoundError: [Errno 2] No such file or directory: 's3://dir'
 

Конечно, каталог существует, поскольку я вижу файлы CSV в этом каталоге S3. Я также не ввел его неправильно, так как я просто копирую-вставляю. Следовательно, это говорит о том, что, возможно, я не могу просмотреть его из кластера EMR.

Обратите внимание, я могу загрузить один CSV-файл следующим образом:

 df = pd.read_csv('s3://dir/part-00000-d27fd1c5-96d0-431c-88d8-4b216fe008d5-c000.csv')
df
 

Но это, очевидно, сложно / неэффективно выполнять вручную для каждого из тысячи CSV-файлов, которые у меня есть.

Есть идеи, что еще попробовать или как это отладить?

Комментарии:

1. Вы перемещаетесь по s3:// URL-адресам в стиле виртуального хостинга — установлено ли у вас что-нибудь, что действительно решает их для вас?

2. Я не думаю, что этого достаточно, смотрите Здесь о том, как подключиться к s3, затем вы можете изменить этот код, чтобы сделать это в цикле.

3. @cs95 Я работаю над ноутбуком AWS EMR, подключенным к кластеру EMR. Обычно я привык работать в Scala и загружать каталоги S3 с тысячами CSV в фрейм данных Spark. Однако я не могу эмулировать тот же подход, используя Python 3.

4. Да, но вы пробовали аутентифицировать свой сеанс с помощью python? То, что ноутбук подключен, не обязательно означает, что оболочка python может получить к нему доступ без аутентификации.

5. @cs95 не уверен, что вы подразумеваете под «аутентификацией моего сеанса с помощью python». Как это будет выглядеть? У меня открыт другой ноутбук с ядром Spark, и я могу получить доступ к тому же каталогу S3.

Ответ №1:

если у вас одинаковые столбцы во всех ваших .CSV файлах, то это может быть просто тренировкой для вас.

 import pandas as pd
import glob

path = r'C:DRODCL_rawdata_files' # use your path
all_files = glob.glob(path   "/*.csv")

li = []

for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0)
    li.append(df)

frame = pd.concat(li, axis=0, ignore_index=True)
 

Здесь я добавил header=0 , чтобы после чтения .CSV первая строка могла быть назначена в качестве имен столбцов.

Комментарии:

1. Выдает ту же ошибку, что и другие вещи, которые я пробовал (см. Сообщение).