【问题标题】:How to use date filter correctly on aws dynamodb boto3如何在 aws dynamodb boto3 上正确使用日期过滤器
【发布时间】:2022-01-12 16:24:22
【问题描述】:

我想在 dynamodb 的表中检索项目。然后我将此数据添加到大查询中表的最后一个数据下方。

client = boto3.client('dynamodb')
table = dynamodb.Table('table')
response = table.scan(FilterExpression=Attr('created_at').gt(max_date_of_the_table_in_big_query))

#first part
data = response['Items']

#second part
while response.get('LastEvaluatedKey'):
    response = table.scan(ExclusiveStartKey=response['LastEvaluatedKey'])
    data.extend(response['Items'])

df=pd.DataFrame(data)
df=df[['query','created_at','result_count','id','isfuzy']]

# load df to big query
.....

日期过滤器工作正常,但在 while 循环会话(第二部分)中,代码检索所有项目。 在第一部分之后,我有 100 行。但是在这段代码之后

while response.get('LastEvaluatedKey'):
    response = table.scan(ExclusiveStartKey=response['LastEvaluatedKey'])
    data.extend(response['Items'])

我有 500.000 行。我只能使用第一部分。但我知道有 1 mb 的限制,这就是我使用第二部分的原因。如何获取给定日期范围内的数据

【问题讨论】:

  • 您没有将FilterExpression 应用于第二次扫描。
  • 谢谢它的工作,但它花了太长时间。第一部分用时不到 1 分钟,而第二部分用了 5 多分钟。 (我使用了一个非常短的时间框架作为实验,两个部分的输出都是相同的数据。)我想知道为什么会发生这种情况。
  • 扫描大表总是会有问题的。要了解基于时间戳的查询的选项,请参阅 here 和可选的 here

标签: python amazon-web-services boto3


【解决方案1】:

您的第一次扫描 API 调用有一个 FilterExpression 集,它会应用您的数据过滤器:

response = table.scan(FilterExpression=Attr('created_at').gt(max_date_of_the_table_in_big_query))

但是,第二次扫描 API 调用没有一组,因此不会过滤您的数据:

response = table.scan(ExclusiveStartKey=response['LastEvaluatedKey'])

FilterExpression 应用于两个调用:

while response.get('LastEvaluatedKey'):
    response = table.scan(
       ExclusiveStartKey=response['LastEvaluatedKey'], 
       FilterExpression=Attr('created_at').gt(max_date_of_the_table_in_big_query)    
    )
    data.extend(response['Items'])

【讨论】:

    猜你喜欢
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多