使用触发器使用 AWS lambda 自动清理 CSV 文件
Automate CSV file cleaning with AWS lambda using a trigger
我正在尝试创建一个 Lambda 函数,它将自动从 S3 存储桶中清除 csv 文件。
S3 存储桶每 5 百万接收一次文件,因此我为 Lambda 函数创建了一个触发器。
为了清理 csv 文件,我将使用 pandas 库来创建数据框。我已经安装了一个 pandas 层。创建数据框时,有一条错误消息。
这是我的代码:
import json
import boto3
import pandas as pd
from io import StringIO
#call s3 bucket
client = boto3.client('s3')
def lambda_handler(event, context):
#define bucket_name and object _name
bucket_name = event['Records'][0]['s3']['bucket']['name']
object_name = event['Records'][0]['s3']['object']['key']
#create a df from the object
df = pd.read_csv(object_name)
这是错误信息:
[ERROR] FileNotFoundError: [Errno 2] No such file or directory: 'object_name'
在 Cloudwatch 上它还说:
OpenBLAS WARNING - could not determine the L2 cache size on this system, assuming 256k
有没有人遇到过同样的问题?预先感谢您的所有帮助!
在使用pandas之前,您必须使用s3客户端从s3下载文件。类似于:
response = client.get_object(Bucket=bucket_name, Key=object_name)
df = pd.read_csv(response["Body"])
您必须确保 lambda 具有访问 s3 存储桶的正确权限。
更改此行:
df = pd.read_csv("object_name")
对此:
df = pd.read_csv(object_name)
错误原因
object_name
只是 s3 对象相对于 bucket 的相对路径(键),没有 bucket_name
就没有意义,因此当您尝试读取 csv 文件时得到 FileNotFoundError
错误的解决方案
为了正确引用 s3 对象,您必须从 bucket_name
和 object_name
构建完全限定的 s3 路径。另请注意,对象键有一些引用字符,因此在构建完全限定路径之前,您必须取消对它们的引用。
from urllib.parse import unquote_plus
def lambda_handler(event, context):
#define bucket_name and object _name
bucket_name = event['Records'][0]['s3']['bucket']['name']
object_name = event['Records'][0]['s3']['object']['key']
#create a df from the object
filepath = f's3://{bucket_name}/{unquote_plus(object_name)}'
df = pd.read_csv(filepath)
我正在尝试创建一个 Lambda 函数,它将自动从 S3 存储桶中清除 csv 文件。 S3 存储桶每 5 百万接收一次文件,因此我为 Lambda 函数创建了一个触发器。 为了清理 csv 文件,我将使用 pandas 库来创建数据框。我已经安装了一个 pandas 层。创建数据框时,有一条错误消息。 这是我的代码:
import json
import boto3
import pandas as pd
from io import StringIO
#call s3 bucket
client = boto3.client('s3')
def lambda_handler(event, context):
#define bucket_name and object _name
bucket_name = event['Records'][0]['s3']['bucket']['name']
object_name = event['Records'][0]['s3']['object']['key']
#create a df from the object
df = pd.read_csv(object_name)
这是错误信息:
[ERROR] FileNotFoundError: [Errno 2] No such file or directory: 'object_name'
在 Cloudwatch 上它还说:
OpenBLAS WARNING - could not determine the L2 cache size on this system, assuming 256k
有没有人遇到过同样的问题?预先感谢您的所有帮助!
在使用pandas之前,您必须使用s3客户端从s3下载文件。类似于:
response = client.get_object(Bucket=bucket_name, Key=object_name)
df = pd.read_csv(response["Body"])
您必须确保 lambda 具有访问 s3 存储桶的正确权限。
更改此行:
df = pd.read_csv("object_name")
对此:
df = pd.read_csv(object_name)
错误原因
object_name
只是 s3 对象相对于 bucket 的相对路径(键),没有 bucket_name
就没有意义,因此当您尝试读取 csv 文件时得到 FileNotFoundError
错误的解决方案
为了正确引用 s3 对象,您必须从 bucket_name
和 object_name
构建完全限定的 s3 路径。另请注意,对象键有一些引用字符,因此在构建完全限定路径之前,您必须取消对它们的引用。
from urllib.parse import unquote_plus
def lambda_handler(event, context):
#define bucket_name and object _name
bucket_name = event['Records'][0]['s3']['bucket']['name']
object_name = event['Records'][0]['s3']['object']['key']
#create a df from the object
filepath = f's3://{bucket_name}/{unquote_plus(object_name)}'
df = pd.read_csv(filepath)