基于AWS Lambda实时处理DynamoDB表:查询及转Pandas DataFrame问题
DynamoDB查询最近96条数据并转换为Pandas DataFrame
1. 查询DynamoDB表获取最近96行数据
要高效获取最近的96条数据,核心是利用时间戳列作为排序键(主表排序键或全局二级索引(GSI)的排序键),避免全表扫描,提升查询效率。
实现步骤:
- 表结构配置:如果当前表主键未包含时间戳,建议创建GSI:
- 分区键设为固定标识(比如
stream_type,统一赋值为iot_data),确保所有IoT数据归为同一分区; - 排序键指定为时间戳列(如
timestamp),支持按时间排序。
- 分区键设为固定标识(比如
- Lambda查询代码:使用boto3的
query方法,指定倒序查询并限制返回条数:
import boto3 # 初始化DynamoDB资源 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('你的DynamoDB表名') # 执行查询:匹配GSI分区键,倒序取最近96条 response = table.query( IndexName='你的GSI名称', KeyConditionExpression=boto3.dynamodb.conditions.Key('stream_type').eq('iot_data'), ScanIndexForward=False, # 按排序键降序,最新数据在前 Limit=96 ) # 提取数据条目 latest_items = response['Items']
如果主表主键是「设备ID(分区键)+ 时间戳(排序键)」,直接查询主表即可,只需将KeyConditionExpression替换为对应设备ID的匹配条件。
2. 转换为Pandas DataFrame格式
DynamoDB返回的Items是字典列表,可直接传入Pandas构造函数,同时处理时间戳列的类型转换:
import pandas as pd # 转换为DataFrame df = pd.DataFrame(latest_items) # 处理时间戳列(根据实际格式调整) # 场景1:时间戳为Unix秒级时间戳 df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s') # 场景2:时间戳为ISO格式字符串(如"2024-05-20T12:34:56Z") df['timestamp'] = pd.to_datetime(df['timestamp']) # 可选:将DataFrame按时间戳正序排列 df = df.sort_values('timestamp', ascending=True)
注意事项:
Lambda默认环境无Pandas依赖,需通过Lambda层打包Pandas,或使用包含Pandas的容器镜像部署函数。
内容的提问来源于stack exchange,提问作者Higor Nunes
相关产品推荐
相关产品推荐

