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()可能有助于并行化多部分上传。
您可以使用boto3上传文件,但是,鉴于您正在使用数据框,pandas您应该考虑dask. 您可以通过安装它conda install dask s3fs
import dask.dataframe as dd
Run Code Online (Sandbox Code Playgroud)
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,您应该首先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.csv与dask随后而不是有一个文件叫test.csv你将有包含该名称的文件夹N文件,其中N是我们之前决定分区的数量。
我知道保存到多个文件可能会感觉很奇怪,但考虑到dask读取文件夹中的所有文件,一旦你习惯了,它可能会非常方便。
| 归档时间: |
|
| 查看次数: |
9165 次 |
| 最近记录: |