Загрузка фрейма данных в AWS S3 Bucket из SageMaker

Я новичок в среде 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?


person realkes    schedule 28.06.2019    source источник
comment
Я не думаю, что вы можете просто указать URL-адрес в качестве пути для to_csv. Может быть, вы могли бы попробовать сохранить его как локальный файл, а затем загрузить его с помощью requests? Или как-то преобразовать в строку?   -  person 101arrowz    schedule 28.06.2019
comment
К сожалению, я не могу использовать локальный файл, потому что одна из целей проекта - попытаться сохранить все в облаке. Спасибо за комментарий @ 101arrowz   -  person realkes    schedule 28.06.2019


Ответы (2)


Один из способов решить эту проблему - сохранить 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() может помочь при распараллеливании в виде загрузки из нескольких частей.

person Nick Walsh    schedule 28.06.2019
comment
В настоящее время я использую этот метод, но стараюсь не сохранять копию в Sagemaker, поскольку загружаю тысячи CSV-файлов. Есть ли способ загрузки на S3 без сохранения файлов csv в Sagemaker? - person Pleastry; 03.08.2020

Вы можете использовать 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 не совпадает с dask, в частности, последний имеет параметр storage_options. Кроме того, dask не сохраняет в уникальный файл. Позвольте мне объяснить: если вы решите писать в s3://my_bucket/test.csv с помощью dask, тогда вместо файла с именем test.csv у вас будет папка с этим именем, содержащая N файл, где N - это количество разделов, которое мы решили ранее.

Заключительное примечание

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

person rpanai    schedule 28.06.2019
comment
Спасибо за комментарий @rpanai. Когда я запускаю ваш код, я получаю следующее сообщение об ошибке: TypeError: to_csv() got an unexpected keyword argument 'storage_options - person realkes; 28.06.2019
comment
Df - это pandas или dask dataframe? - person rpanai; 28.06.2019