使用谷歌云存储将数据从gcs传输到s3
我正在制作一个小应用程序,将数据从BigQuery导出到google-cloud-storage,然后将其复制到aws s3中,但无法找到如何在python中执行此操作。
我已经写了kotlin的代码(因为这对我来说是最简单的,我的问题范围之外的原因,我们希望它运行在python),在google sdk
允许我从Blob
对象得到一个InputSteam
,然后我可以注入到amazon s3 sdk's
AmazonS3.putObject(String bucketName, String key, InputStream input, ObjectMetadata metadata)
。
与python sdk
似乎我只有选择下载文件到一个文件和一个字符串。
我想(就像我在kotlin中那样)将Blob
对象返回的一些对象传递给AmazonS3.putObject()
方法,而不必先将内容保存为文件。
我不是一个Python专家,所以我可能已经错过了一个明显的方式做到这一点。
我结束了以下解决方案,显然download_to_filename
将数据下载到boto3 s3 client
可以处理的文件类对象中。
这对于较小的文件来说工作得很好,但是由于它将所有内容都缓存在内存中,所以对于较大的文件可能会有问题。
def copy_data_from_gcs_to_s3(gcs_bucket, gcs_filename, s3_bucket, s3_filename): gcs_client = storage.Client(project="my-project") bucket = gcs_client.get_bucket(gcs_bucket) blob = bucket.blob(gcs_filename) data = BytesIO() blob.download_to_file(data) data.seek(0) s3 = boto3.client("s3") s3.upload_fileobj(data, s3_bucket, s3_filename)
如果任何人有关于BytesIO之外的信息/知识来处理数据(fx。所以我可以直接将数据流到s3中,而不必将其缓存在主机上的内存中),这将是非常值得赞赏的。