AWS DynamoDB Boto3 Scan不同执行方式返回行数不一致疑问
AWS DynamoDB Boto3 Scan返回结果行数不一致原因分析
1. 代码逻辑存在致命错误,是X和Y数值不同的核心原因
- 翻页请求未携带过滤条件:你首次调用
scan时传入了FilterExpression=date_filter,但后续循环中调用scan仅传入了ExclusiveStartKey,没有携带相同的过滤条件,相当于翻页时直接扫描全表而非指定日期范围的数据,导致结果完全不符合预期 - 终止判断逻辑错误:你仅校验了每页第一个元素的日期是否在范围内,只要第一个不符合就直接终止循环,会漏掉当前页后续符合条件的元素;同时代码中硬编码的终止判断上限是
2021-06-07,和单日查询的2021-01-01范围不匹配,还有连续两次调用replace(tzinfo=None)的笔误,都会导致结果统计不准 - 边界场景未处理:如果某页Scan返回的
Items为空,直接访问response['Items'][0]会触发索引报错,导致逻辑提前中断,漏取后续数据
2. describe_table返回的Z和前两个数值不同的原因
describe_table接口返回的ItemCount是近似统计值,DynamoDB每6小时才会更新一次该数值,不是实时计数结果,完全不能作为准确行数参考。
修复建议
- 每次翻页调用
scan时,必须携带和首次请求完全一致的FilterExpression参数,不要自行在业务代码判断日期范围,交由DynamoDB过滤逻辑处理 - 删除自定义的日期判断终止逻辑,仅用
LastEvaluatedKey是否存在作为翻页终止条件 - 如需准确计数,累加每次
scan响应返回的Count字段值,不要依赖describe_table的统计结果
内容的提问来源于stack exchange,提问作者Guilherme Cesar
相关产品推荐
相关产品推荐

