【问题标题】:Uploading a Dataframe to AWS S3 Bucket from SageMaker从 SageMaker 将数据帧上传到 AWS S3 存储桶
【发布时间】:2019-06-28 00:36:23
【问题描述】:

我是 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)

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

【问题讨论】:

  • 我认为您不能只将 Web URL 作为to_csv 的路径放入。也许您可以尝试将其保存为本地文件,然后使用requests 上传?还是以某种方式将其转换为字符串?
  • 不幸的是,我不能使用本地文件,因为该项目的一个目标是尝试将所有内容都保存在云端。感谢您的评论@101arrowz

标签: python pandas amazon-web-services amazon-s3 amazon-sagemaker


【解决方案1】:

解决此问题的一种方法是将 CSV 保存到 SageMaker 笔记本实例上的本地存储中,然后通过 boto3 使用 S3 API 将文件作为 s3 对象上传。 S3 docs for upload_file() available here.

请注意,您需要确保您的 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() 可能有助于并行化为多部分上传。

【讨论】:

  • 我目前正在使用这种方法,但由于我上传了数千个 csv,因此我试图避免在 Sagemaker 中保存副本。有没有办法上传到 S3 而无需在 Sagemaker 中保存 csv 文件?
【解决方案2】:

您可以使用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 加载到您需要的分区数(必须指定)

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})

更新

尽管APIpandas 中的to_csv 相似,但与dask 中的dask 不同,尤其是后者具有storage_options 参数。 此外,dask 不会保存到唯一的文件中。让我解释一下:如果您决定使用dask 写入s3://my_bucket/test.csv,那么您将拥有一个名为test.csv 的文件夹,其中包含N 文件,其中N 是我们之前决定的分区数。

最后说明

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

【讨论】:

  • 感谢您的评论@rpanai。当我运行您的代码时,我收到以下错误消息:TypeError: to_csv() got an unexpected keyword argument 'storage_options
  • df 是 pandas 还是 dask 数据框?
猜你喜欢
  • 2019-04-08
  • 2019-08-06
  • 2021-07-23
  • 2020-07-29
  • 2018-04-25
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多