如何从 S3 加载泡菜文件以在 AWS Lambda 中使用?

Posted

技术标签:

【中文标题】如何从 S3 加载泡菜文件以在 AWS Lambda 中使用?【英文标题】:How to load a pickle file from S3 to use in AWS Lambda? 【发布时间】:2018-08-04 11:22:11 【问题描述】:

我目前正在尝试将腌制文件从 S3 加载到 AWS lambda 中并将其存储到列表中(腌制是一个列表)。

这是我的代码:

import pickle
import boto3

s3 = boto3.resource('s3')
with open('oldscreenurls.pkl', 'rb') as data:
    old_list = s3.Bucket("pythonpickles").download_fileobj("oldscreenurls.pkl", data)

即使文件存在,我也会收到以下错误:

FileNotFoundError: [Errno 2] No such file or directory: 'oldscreenurls.pkl'

有什么想法吗?

【问题讨论】:

【参考方案1】:

超级简单的解决方案

import pickle
import boto3

s3 = boto3.resource('s3')
my_pickle = pickle.loads(s3.Bucket("bucket_name").Object("key_to_pickle.pickle").get()['Body'].read())

【讨论】:

我喜欢这个答案,因为它有效、简单、直接。 这是一个很好的解决方案。使 s3 上的 pkl 几乎与 s3 路径的 pd.read_csv 集成一样可访问。【参考方案2】:

download_fileobj 的文档所示,您需要先以二进制写入 模式打开文件并保存到文件中。下载文件后,您可以打开它进行阅读和解压。

import pickle
import boto3

s3 = boto3.resource('s3')
with open('oldscreenurls.pkl', 'wb') as data:
    s3.Bucket("pythonpickles").download_fileobj("oldscreenurls.pkl", data)

with open('oldscreenurls.pkl', 'rb') as data:
    old_list = pickle.load(data)

download_fileobj 获取 S3 中对象的名称以及本地文件的句柄,并将该对象的内容保存到文件中。这个函数还有一个版本叫做download_file,它接受一个文件名而不是一个打开的文件句柄,并为你处理打开它。

在这种情况下,使用S3Client.get_object 可能会更好,以避免必须写入然后立即读取文件。您还可以写入内存中的 BytesIO 对象,该对象的作用类似于文件,但实际上并不触及磁盘。看起来像这样:

import pickle
import boto3
from io import BytesIO

s3 = boto3.resource('s3')
with BytesIO() as data:
    s3.Bucket("pythonpickles").download_fileobj("oldscreenurls.pkl", data)
    data.seek(0)    # move back to the beginning after writing
    old_list = pickle.load(data)

【讨论】:

编辑:我不知道如何在 cmets 中使用代码块。在您发布示例之前,我阅读了这篇文章并尝试了 get_object 路由,并且下面的代码有效!谢谢! response = s3client.get_object(Bucket="pythonpickles", Key="oldscreenurls.pkl") pickled_list = response['Body'].read() old_list = pickle.loads(pickled_list)【参考方案3】:

这是最简单的解决方案。您甚至可以使用 S3FileSystem

在本地加载数据而无需下载文件
from s3fs.core import S3FileSystem
s3_file = S3FileSystem()

data = pickle.load(s3_file.open('/'.format(bucket_name, file_path)))

【讨论】:

以上是关于如何从 S3 加载泡菜文件以在 AWS Lambda 中使用?的主要内容,如果未能解决你的问题,请参考以下文章

使用nodejs AWS lambda从S3加载并解析yaml文件

如何使用 Pig Latin 从 AWS S3 加载数据

如何从一个账户访问 s3 存储桶中的数据以在另一个账户中使用 redshift 处理数据?

用于将数据从AWS S3加载到Redshift的Python脚本

加载文件后如何清理 AWS Firehose 使用的 S3 文件?

通过 Apache-Spark 从 AWS S3 加载数据