首页 > 解决方案 > 如果项目在本地 dynamodb 中超过 1350+,则无法正确插入

问题描述

我正在为 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。有什么限制吗?

标签: amazon-dynamodbboto3amazon-dynamodb-local

解决方案


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

在每个调用(第一个除外)中,您需要使用响应ExeclusiveStartKey中的值进行设置。LastEvaluatedKey如果LastEvaluatedKey未设置,您应该停止调用scan(). 请参阅此答案中的示例代码。


推荐阅读