#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. Выдает ту же ошибку, что и другие вещи, которые я пробовал (см. Сообщение).