从 SageMaker 将 Dataframe 上传到 AWS S3 存储桶

问题描述 投票:0回答:3

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

我有一个数据框,想要将其以 CSV 或 JSON 格式上传到 S3 存储桶。我的代码如下:

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 时无法选择隐私选项。有没有办法将数据从 SageMaker 上传到 S3?

python pandas amazon-web-services amazon-s3 amazon-sagemaker
3个回答
16
投票

解决此问题的一种方法是将 CSV 保存到 SageMaker 笔记本实例上的本地存储,然后通过

boto3
使用 S3 API 将文件作为 s3 对象上传。
upload_file()
的 S3 文档可在此处获取。

请注意,您需要确保您的 SageMaker 托管笔记本实例在其 IAM 角色中具有适当的

ReadWrite
权限,否则您将收到权限错误。

# 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()
可能有助于并行化多部分上传。


6
投票

您可以使用

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
读取文件夹中的所有文件,一旦你习惯了,它可能会非常方便。


0
投票

另一个选择是使用 awswrangler 库。然后您可以上传 csv 文件,而无需先将其保存在 sagemaker 中。

import awswrangler as wr
wr.s3.to_csv(df=df, path=data_location)
© www.soinside.com 2019 - 2024. All rights reserved.