如何在aws dynamodb boto3中正确使用日期过滤器获取指定范围数据
问题根因
DynamoDB的每次Scan请求都是独立的,你仅在首次调用时传入了FilterExpression日期过滤条件,后续循环中发起的分页Scan请求只带了分页起始键ExclusiveStartKey,没有携带过滤参数,导致后续请求直接返回全表扫描结果,最终拉取了所有数据。
修复代码
你只需要把所有Scan通用的参数抽出来,每次分页请求都全量传入即可,修改后代码如下:
import boto3 import pandas as pd from boto3.dynamodb.conditions import Attr dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('table') # 预先定义所有通用Scan参数,避免重复编写 scan_params = { "FilterExpression": Attr('created_at').gt(max_date_of_the_table_in_big_query) } response = table.scan(**scan_params) data = response['Items'] # 分页循环时每次都传入所有通用参数+当前分页起始键 while response.get('LastEvaluatedKey'): scan_params["ExclusiveStartKey"] = response['LastEvaluatedKey'] response = table.scan(**scan_params) data.extend(response['Items']) df=pd.DataFrame(data) df=df[['query','created_at','result_count','id','isfuzy']] # 后续加载到BigQuery的逻辑保持不变 .....
额外优化建议
- 如果你需要频繁按
created_at范围拉取数据,且表的总数据量很大,建议给created_at字段建全局二级索引(GSI),用Query操作替代Scan操作,能大幅降低读容量消耗、提升查询效率。 - 可以根据实际场景给Scan请求加
ProjectionExpression参数,只返回你需要的query、created_at、result_count、id、isfuzy这几个字段,减少数据传输量。
内容的提问来源于stack exchange,提问作者Bushmaster
相关产品推荐
相关产品推荐

