从 SageMaker 将数据帧上传到 AWS S3 Bucket

rea*_*kes 5 python amazon-s3 amazon-web-services pandas amazon-sagemaker

我是 AWS 环境的新手,正在尝试解决数据流的工作原理。将 CSV 文件从 S3 成功上传到 SageMaker 笔记本实例后,我坚持做相反的事情。

我有一个数据框,想将其作为 CSV 或 JSON 上传到 S3 Bucket。我的代码如下:

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

我假设因为我pd.read_csv()在加载时成功使用,使用df.to_csv()也可以,但它没有。可能它会产生错误,因为这样我无法在手动将文件上传到 S3 时选择隐私选项。有没有办法将数据从 SageMaker 上传到 S3?

Nic*_*lsh 14

解决此问题的一种方法是将 CSV 保存到 SageMaker 笔记本实例上的本地存储,然后使用 S3 API 的 viaboto3将文件作为 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)
Run Code Online (Sandbox Code Playgroud)
# 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')
Run Code Online (Sandbox Code Playgroud)

或者,upload_fileobj()可能有助于并行化多部分上传。

  • 我目前正在使用此方法,但我试图避免在 Sagemaker 中保存副本,因为我正在上传数千个 csv。有没有办法上传到 S3 而无需在 Sagemaker 中保存 csv 文件? (3认同)

rpa*_*nai 5

您可以使用boto3上传文件,但是,鉴于您正在使用数据框,pandas您应该考虑dask. 您可以通过安装它conda install dask s3fs

import dask.dataframe as dd
Run Code Online (Sandbox Code Playgroud)

从 S3 读取

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

更新

现在,如果您想将此文件用作pandas数据帧,则应将其计算为

df = df.compute()
Run Code Online (Sandbox Code Playgroud)

写入 S3

要写回 S3,您应该首先df使用您需要的分区数(必须指定)加载到 dask

df = dd.from_pandas(df, npartitions=N)
Run Code Online (Sandbox Code Playgroud)

然后你可以上传到S3

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

更新

尽管API相似,但to_csvinpandas与 in 不同dask,特别是后者具有storage_options参数。此外dask不会保存到唯一的文件。让我来解释一下:如果你决定写入s3://my_bucket/test.csvdask随后而不是有一个文件叫test.csv你将有包含该名称的文件夹N文件,其中N是我们之前决定分区的数量。

最后说明

我知道保存到多个文件可能会感觉很奇怪,但考虑到dask读取文件夹中的所有文件,一旦你习惯了,它可能会非常方便。