从 SageMaker 将 Dataframe 上传到 AWS S3 Bucket
Uploading a Dataframe to AWS S3 Bucket from SageMaker
我是 AWS 环境的新手,正在尝试解决数据流的工作原理。将 CSV 文件从 S3 成功上传到 SageMaker notebook 实例后,我一直坚持执行相反的操作。
我有一个数据框,想将其作为 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?
解决此问题的一种方法是将 CSV 保存到 SageMaker notebook 实例的本地存储中,然后使用 S3 API 通过 boto3
将文件作为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()
可能有助于并行化为 multi-part 上传。
您可以使用 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})
更新
尽管 API
相似,但 pandas
中的 to_csv
与 dask
中的不同,特别是后者具有 storage_options
范围。
此外 dask
不会保存到唯一文件。让我解释一下:如果您决定使用 dask
写入 s3://my_bucket/test.csv
,那么您将拥有一个包含 N
的文件夹,而不是一个名为 test.csv
的文件] 文件,其中 N
是我们之前决定的分区数。
最后的笔记
我知道保存到多个文件可能会感觉很奇怪,但考虑到 dask
读取文件夹中的所有文件,一旦您习惯了,它会非常方便。
我是 AWS 环境的新手,正在尝试解决数据流的工作原理。将 CSV 文件从 S3 成功上传到 SageMaker notebook 实例后,我一直坚持执行相反的操作。
我有一个数据框,想将其作为 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?
解决此问题的一种方法是将 CSV 保存到 SageMaker notebook 实例的本地存储中,然后使用 S3 API 通过 boto3
将文件作为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()
可能有助于并行化为 multi-part 上传。
您可以使用 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})
更新
尽管 API
相似,但 pandas
中的 to_csv
与 dask
中的不同,特别是后者具有 storage_options
范围。
此外 dask
不会保存到唯一文件。让我解释一下:如果您决定使用 dask
写入 s3://my_bucket/test.csv
,那么您将拥有一个包含 N
的文件夹,而不是一个名为 test.csv
的文件] 文件,其中 N
是我们之前决定的分区数。
最后的笔记
我知道保存到多个文件可能会感觉很奇怪,但考虑到 dask
读取文件夹中的所有文件,一旦您习惯了,它会非常方便。