AWS Lambda 不支持的类型 "<class 'numpy.int64'>":将数据上传到 Dynamodb 时出现类型错误



我有一个lambda函数,它检查s3存储桶中的创建事件。如果一个文件被上传到bucket中,我会解析该文件,并将结果上传到一个dynamodb表中。以下是我的函数。

import json
import boto3
import pandas as pd
import urllib
import io
import uuid
import logging
path = "sensor-data.csv"
obj = s3.get_object(Bucket='sensor-bucket', Key=path)
csv_string = io.BytesIO(obj['Body'].read())
# Read a csv file and turn it into a DataFrame
df = pd.read_csv(csv_string, delimiter=';', engine ='c', encoding= 'unicode_escape')
# Rename columns as seen in the Lambda Function
df.rename(columns={'< 5,6m': 'SmallSize', '>= 5,6m': 'LargeSize'}, inplace=True)
df.Felt.replace(['1', '2', '3', '4'], ['lane_1', 'lane_2', 'lane_3', 'lane_4'], inplace=True)
# Filter out data column
data = df['data'] = df[['Navn', 'Vegreferanse', 'Fra', 'Til', 'Volum',
'Felt', 'SmallSize', 'LargeSize']].to_json(orient='records')
# Calculate traffic
traffic = df.groupby(['Felt'])['Volum'].sum().to_dict()
# Create a Dictionary for a new DataFrame
data = {'sensor-id': df.Trafikkregistreringspunkt.iloc[0], 'data': data,
'date': df.Dato.iloc[0], 'Id': str(uuid.uuid4()), 'traffic': [traffic]}
# Create the dataframe
df2 = pd.DataFrame(data, index=[0])
print("Parsing complete. Writing to table...")
# Connect to dynamodb push items to the table
dynamoDb = boto3.resource('dynamodb')
table = dynamoDb.Table("sensor-data-table")
for line in df2.T.to_dict().values():
table.put_item(Item=line)
print("Data processing completed successfully!")

在我的本地机器上,我可以运行代码,并将数据放入表中。然而,当我尝试在Lambda函数上这样做时,我会得到以下错误;

Unsupported type "<class 'numpy.int64'>" for value "1996": TypeError

1996年是我试图上传到表中的一个值。以下是df2.T.to_dict((.values((的样子;

dict_values([{'sensor-id': '11219V22151', 
'data': '[{"Some Data Here"}]', 
'date': '2020-01-01', 
'Id': '107d8ce5-c7d2-4b86-af83-d5ce7d11ce74', 
'traffic': {'Totalt': 1996, 'Totalt i retning Fianex Rv 415': 944, 
'Totalt i retning Stølen X Rv 420': 1052, 'lane_1': 1052, 'lane_2': 944}}])

我希望能在这个问题上得到一些帮助和澄清。

原来我使用的是一个有点过时的预先制作的lambda部署包。我创建了一个venv,然后使用构建脚本创建zip文件。它运行得非常好。

最新更新