从SageMaker将数据帧上传到AWS S3存储桶

时间:2019-06-28 00:36:23

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

我是AWS环境的新手,正在尝试解决数据流的工作方式。从S3成功将CSV文件上传到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?

2 个答案:

答案 0 :(得分: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()可能有助于并行化为分段上传。

答案 1 :(得分:1)

您可以使用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})

更新

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

最后通知

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