我是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?
答案 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
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,您应该首先将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
与to_csv
中的pandas
类似,但与dask
中的storage_options
不同,尤其是后者具有dask
参数。
此外,s3://my_bucket/test.csv
不会保存到唯一文件。让我解释一下:如果您决定使用dask
来写入test.csv
,那么您将拥有一个包含{{1}的文件夹,而不是一个名为N
的文件。 }文件,其中N
是我们之前确定的分区数。
我知道保存到多个文件可能很奇怪,但是考虑到dask
会读取一个文件夹中的所有文件,一旦习惯了,这将非常方便。