You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:06:03