Загрузка Dataframe в AWS S3 Bucket из SageMaker - PullRequest
1 голос
/ 28 июня 2019

Я новичок в среде AWS и пытаюсь решить, как работает поток данных.После успешной загрузки файлов CSV из S3 в экземпляр ноутбука SageMaker, я застрял на обратном пути.

У меня есть фрейм данных, и я хочу загрузить его в S3 Bucket как CSV или JSON.Код, который я имею ниже:

bucket='bucketname'
data_key = 'test.csv'
data_location = 's3://{}/{}'.format(bucket, data_key)
df.to_csv(data_location)

Я предполагал, так как я успешно использовал pd.read_csv() при загрузке, использование df.to_csv() также будет работать, но это не сработало.Вероятно, это вызывает ошибку, потому что таким образом я не могу выбрать параметры конфиденциальности при загрузке файла вручную на S3.Есть ли способ загрузить данные в S3 из SageMaker?

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Вы можете использовать boto3 для загрузки файла, но, учитывая, что вы работаете с фреймом данных и pandas, вам следует учитывать dask. Вы можете установить его через conda install dask s3fs

import dask.dataframe as dd

Читать с S3

df = dd.read_csv('s3://{}/{}'.format(bucket, data2read),
                 storage_options={'key': AWS_ACCESS_KEY_ID,
                                   'secret': AWS_SECRET_ACCESS_KEY})

Обновление

Теперь, если вы хотите использовать этот файл в качестве pandas кадра данных, вы должны вычислить его как

df = df.compute()

Запись на S3

Для обратной записи в S3 сначала необходимо загрузить df в dask с номером раздела (должен быть указан), который вам нужен

df = dd.from_pandas(df, npartitions=N)

А потом вы можете загрузить на S3

df.to_csv('s3://{}/{}'.format(bucket, data2write),
          storage_options={'key': AWS_ACCESS_KEY_ID,
                           'secret': AWS_SECRET_ACCESS_KEY})

Обновление

Несмотря на то, что API аналогичен, to_csv в pandas не совпадает с * в 1031 *, в частности, последний имеет параметр storage_options. Кроме того, dask не сохраняет в уникальный файл. Позвольте мне объяснить: если вы решите записать в s3://my_bucket/test.csv с помощью dask, то вместо файла с именем test.csv у вас будет папка с таким именем, содержащая N файлов, где N - это количество разделов, которые мы определили ранее.

Заключительная записка

Я понимаю, что может быть странно сохранять несколько файлов, но, учитывая, что dask читает все файлы в папке, как только вы привыкнете, это может быть очень удобно.

1 голос
/ 28 июня 2019

Одним из способов решения этой проблемы было бы сохранение CSV в локальном хранилище на экземпляре записной книжки SageMaker, а затем использование API S3 через boto3 для загрузки файла в качестве объекта s3. Документы S3 для upload_file() доступны здесь.

Обратите внимание, что вам нужно убедиться, что ваш экземпляр ноутбука SageMaker имеет надлежащие разрешения ReadWrite в роли IAM, иначе выполучить ошибку прав доступа.

# code you already have, saving the file locally to whatever directory you wish
file_name = "mydata.csv" 
df.to_csv(file_name)
# instantiate S3 client and upload to s3
import boto3

s3 = boto3.resource('s3')
s3.meta.client.upload_file(file_name, 'YOUR_S3_BUCKET_NAME', 'DESIRED_S3_OBJECT_NAME')

В качестве альтернативы, upload_fileobj() может помочь распараллелить загрузку из нескольких частей.

...