首页 > 解决方案 > DynamoDB Client.Scan() 未返回 LastEvaluatedKey 参数

问题描述

我有一张有 10k 行的表。我正在尝试解析它们以使用 Python 更改属性(每行内)内的一个小东西,所以我使用 client.scan() 批量处理 10 行并将“LastEvaluatedKey”参数提供给 next 。扫描()。

问题是 40 行后 scan() 不会返回 lastKey,就像 DB 一样,它只有 40 行长。

我注意到针对另一个表启动相同的脚本,大 3 倍,停止发生在 120 行(大 3 倍)。

该表具有按需容量。

对此有任何想法吗?

client = boto3.client('dynamodb')
resource = boto3.resource('dynamodb')
table = resource.Table(table_name)

remaining = 3961
iteration = 0
limit = 10

while remaining > 0:
    # retrieve Limit
    if iteration == 0:
        response = client.scan(
            TableName=table_name,
            Limit=limit,
            Select='ALL_ATTRIBUTES',
            ReturnConsumedCapacity='TOTAL',
            TotalSegments=123,
            Segment=122,
        )
        key = response["LastEvaluatedKey"]
    else:

        response = client.scan(
            TableName=table_name,
            Limit=limit,
            Select='ALL_ATTRIBUTES',
            ExclusiveStartKey=key,
            ReturnConsumedCapacity='TOTAL',
            TotalSegments=123,
            Segment=122,
        )

        key = response["LastEvaluatedKey"]

    iteration += 1
    for el in response["Items"]:
        print(el) 

标签: amazon-web-servicesamazon-dynamodb

解决方案


我认为有两个问题:

  1. 您似乎在限制扫描:尝试删除它

  2. 您正在运行并行扫描并始终扫描最后一段:

    总段数=123 段数=122

我不确定你的表有多大,但 123 个段相当多,而且我没有看到你扫描任何其他段,从 0 到 121。


试试这个:

iteration = 0
response = client.scan(
    TableName=table_name,
    Select='ALL_ATTRIBUTES',
    ReturnConsumedCapacity='TOTAL'
)
while True:
    iteration += 1
    for el in response["Items"]:
        print(el)
    last_key = response["LastEvaluatedKey"]
    if not last_key: 
        break
    response = client.scan(
        TableName=table_name,
        Select='ALL_ATTRIBUTES',
        ExclusiveStartKey=last_key,
        ReturnConsumedCapacity='TOTAL'           
    )

我希望以上内容可以检索表中的所有项目。然后,如果你仍然想运行并行扫描,你可以这样做,但你必须处理分割成段,为了提高效率,你必须同时处理运行那些(更复杂的操作比顺序扫描)。


推荐阅读