如果项目在本地 dynamodb 中超过 1350+,则无法正确插入

Could not able to insert properly if items crosses 1350+ in local dynamodb

我正在为 dynamodb 使用本地 docker 设置。我可以在项目较少时插入项目,当数据项目超过 1350 左右时它开始表现错误。

table = dynamodb.create_table(
        TableName='logevents',
        KeySchema=[
            {
                'AttributeName': 'Id',
                'KeyType': 'HASH'  # Partition key
            }
        ],
        AttributeDefinitions=[
            {
                'AttributeName': 'Id',
                'AttributeType': 'S'
            }
        ],
        ProvisionedThroughput={
            'ReadCapacityUnits': 1,
            'WriteCapacityUnits': 1
        }
    )
item = {
    "log_datetime": "2019-08-04 16:16:24:302000",
    "Action": "ApiCallFailed",
    "intuit_tid": "f9d63462-51a6-463b-a19f-b5c6c7867388",
    "PackageName": "com.intuit.billingcomm.billing.ius.facade.DefaultIUSServiceFacade.fetchAllGrants",
    "FileName": "DefaultIUSServiceFacade.java",
    "PID": "9",
    "Processed_timestamp": "2019-09-05 18:17:06:515970",
    "APIKey": "GetAllGrants",
    "thread_id": "x1B35mhttps-jsse-nio-8443-exec-71\x1B0;39m",
    "LastMessage": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX is currently unavailable: status=500",
    "Exceptions": [
        "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.MessageProcessingException",
        "com.intuit.billingcomm.billing.exception.IAMTicketClientException",
        "com.intuit.platform.integration.hats.common.XXXXXXXXXXXXXXXXX"
    ],
    "Event": "XXXXXXXXXX",
    "CategoryLevel1": "XXXXXXXXXXX",

    "Domain": "IUS",
    "LineNo": "128",
    "CategoryLevel2": "TicketServerFailure"
    }

    for x in range(6000):
        item['Id']=str(x)
        table.put_item(
            Item=item)
    scan = table.scan(
        ProjectionExpression='#k',
        ExpressionAttributeNames={
            '#k': 'Id'
        }
    )
    print(str(len(scan['Items'])))

如果我给出范围 600,它会正确显示数据,但如果我给出 6000,它会显示没有项目 1332。有任何限制吗?

我认为可能的情况是您得到了分页结果:当扫描项目的大小超过某个阈值时,您只会获得前几个(在您的情况下,前 1332 个)。然后您需要发出对 scan() 的后续调用以获取下一个块。

在每次调用(第一个调用除外)中,您需要使用响应中的 LastEvaluatedKey 值设置 ExeclusiveStartKey。如果未设置 LastEvaluatedKey,则应停止调用 scan()。请参阅 this answer.

中的示例代码