Boto3 DynamoDb Query с Select Count без нумерации страниц - PullRequest
0 голосов
/ 25 апреля 2020

Это скорее прояснение концепции. Я могу найти фактические значения с помощью Boto3 через повторные запросы с использованием LastEvaluatedKey предыдущего ответа.

Я хочу подсчитать элементы, соответствующие определенным условиям в DynamoDb. Я использую "select = count", который в соответствии с документами [1] должен просто возвращать количество совпадающих элементов, и мое предположение , что ответ не будет разбит на страницы.

COUNT - возвращает количество подходящих элементов, а не сами соответствующие элементы.

Когда я пробую это с помощью aws -cli, мои предположения кажутся правильными (как и остальные примеры API в do c [1])

    aws dynamodb query \
    --table-name 'my-table' \
    --index-name 'classification-date-index' \
    --key-condition-expression 'classification = :col AND #dt BETWEEN :start AND :end' \
    --expression-attribute-values '{":col" : {"S":"INTERNAL"}, ":start" : {"S": "2020-04-10"}, ":end" : {"S": "2020-04-25"}}' \
    --expression-attribute-names '{"#dt" : "date"}' \
    --select 'COUNT'
 {
      "Count": 18817,
      "ScannedCount": 18817,
      "ConsumedCapacity": null
  }

Но когда я пытаюсь использовать Python3 и Boto3, ответ разбивается на страницы, и мне приходится повторять запрос, пока LastEvaluatedKey не станет пустым.

In [22]: table.query(IndexName='classification-date-index', Select='COUNT', KeyConditionExpression= Key('classification').eq('INTERNAL') & Key('date').between('2020-04-10', '2020-04-25'))

Out[22]:
{'Count': 5667,
 'ScannedCount': 5667,
 'LastEvaluatedKey': {'classification': 'INTERNAL',
  'date': '2020-04-14',
  's3Path': '<redacted>'},
 'ResponseMetadata': {'RequestId': 'TH3ILO0P47QB7GAU9M3M98BKJVVV4KQNSO5AEMVJF66Q9ASUAAJG',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'server': 'Server',
   'date': 'Sat, 25 Apr 2020 13:32:36 GMT',
   'content-type': 'application/x-amz-json-1.0',
   'content-length': '230',
   'connection': 'keep-alive',
   'x-amzn-requestid': 'TH3ILO0P47QB7GAU9M3M98BKJVVV4KQNSO5AEMVJF66Q9ASUAAJG',
   'x-amz-crc32': '133035383'},
  'RetryAttempts': 0}}

Я ожидал такого же поведения от SDK Boto3, как aws cli, так как ответ кажется меньше, чем 1mb. Документы немного противоречат друг другу ...

На странице «Страница страниц с результатами запросов» [2] говорится:

DynamoDB разбивает на страницы результаты операций запросов. С разбивкой по страницам результаты запроса делятся на «страницы» данных размером 1 МБ (или меньше). Приложение может обработать первую страницу результатов, затем вторую страницу и так далее. Один запрос возвращает только набор результатов, который вписывается в ограничение размера 1 МБ.

В то время как на странице «Запрос» [1] говорится:

Одна операция запроса будет считывать до максимального количества установленных элементов (если используется параметр Limit) или до 1 МБ данных, а затем применяет любую фильтрацию к результатам, используя FilterExpression.

[1] https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

[2] https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.Pagination.html

...