从SageMaker上传数据框至AWS S3存储桶

12

我是AWS环境的新手,正在尝试解决数据流如何工作的问题。在成功从S3上传CSV文件到SageMaker笔记本实例后,我卡在了反向操作上。

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

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?


我认为你不能只将Web URL作为“to_csv”的路径。也许你可以尝试将其保存为本地文件,然后使用“requests”上传该文件?或者以某种方式将其转换为字符串? - 101arrowz
1
很遗憾,我不能使用本地文件,因为项目的一个目标是尝试将所有内容保留在云端。感谢您的评论@101arrowz。 - realkes
2个回答

14
一种解决方法是将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()可以用于将上传分成多部分以实现并行上传。


3
我目前使用这种方法,但我想避免在Sagemaker中保存副本,因为我要上传成千上万个CSV文件。有没有一种方法可以在不在Sagemaker中保存CSV文件的情况下上传到S3? - Pleastry

6

你可以使用 boto3 来上传文件,但是,考虑到你正在使用 dataframe 和 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 相似,但是 pandas 中的 to_csvdask 中的不同,特别是后者有一个 storage_options 参数。此外,dask 没有保存到唯一文件的功能。让我解释一下:如果您决定使用 dask 写入到 s3://my_bucket/test.csv,那么您将会得到一个名为该名称的文件夹,其中包含我们之前决定的分区数 N 个文件。

最终说明

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


感谢您的评论@rpanai。当我运行您的代码时,出现以下错误消息:TypeError: to_csv() got an unexpected keyword argument 'storage_options - realkes
df是Pandas还是Dask的数据框? - rpanai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接