DynamoDB Client.Scan () не возвращает параметр LastEvaluatedKey - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть таблица с 10k строк. Я пытаюсь проанализировать их, чтобы изменить небольшую вещь внутри атрибута (внутри каждой строки) с помощью Python, поэтому я использую client.scan (), получая пакеты по 10 строк и передавая параметр «LastEvaluatedKey» следующему. сканирование ().

Проблема в том, что после 40 строк функция scan () не возвращает lastKey, как и в БД, длина которой составляет всего 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) 

1 Ответ

0 голосов
/ 09 апреля 2019

Я думаю, что есть две проблемы:

  1. вы, кажется, сканируете с ограничением: попробуйте удалить это

  2. вы выполняете параллельное сканирование и всегда сканируете последний сегмент:

    TotalSegments = 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'           
    )

Я полагаю, что вышеприведенное должно работать для извлечения всех элементов в вашей таблице. Затем, если вы все еще хотите запустить параллельное сканирование, вы можете сделать это, но вам придется обрабатывать разбиение на сегменты, и для того, чтобы это было эффективным, вам нужно будет обрабатывать их одновременно (сложнее сделать чем последовательное сканирование).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...