Как получить данные для построения гистограммы в DynamoDB, используя сканирование всего за один запрос - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь построить гистограмму определенного атрибута в моей динамической базе данных.
Я могу получить все значения, запустив несколько запросов scan count и меняя диапазоны каждый раз

aws dynamodb scan --table-name test --select "COUNT"  \
--filter-expression "(score between :s and :s1)"  \
--expression-attribute-values '{ ":s": { "N": "0" }, ":s1": { "N": "10" } }'

Мой вопрос: могу ли я сделать все это в одном сканировании, получая значения 0-9, 10-19, ... 90-100?

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

Как отметил Майк, DynamoDB не поддерживает запросы агрегирования.
Однако был ценный совет: MapReduce

  1. Создание кластера Amazon, ssh в него
  2. Сопоставить таблицу DynamoDB с таблицей кустов
  3. увеличить емкость чтения вашей таблицы DynamodB (моя таблица содержит 300 МБ элементов, поэтому я увеличил емкость чтения до 4000)
  4. Запустите запрос mapReduce, используя hive:
    hive> select score, count(score) from (select score from hive_my_table limit 300000000) as t1 GROUP by score;
    Мой запрос занял 2054 сек.
    Я получил оценку и количество ее экземпляров (полная гистограмма)

Совет: не бойтесь увеличить емкость чтения, вы сэкономите на времени выполнения кластера. С учётом емкости чтения 100 я рассчитал, что на выполнение запроса уйдет день.

0 голосов
/ 05 июля 2018

Короткий ответ: нет - вы не можете сделать это с помощью одного сканирования.

Чтобы расширить это, есть два препятствия для достижения того, что вы хотите:

1) Сканирование возвращает максимум 1 МБ данных на вызов (см. Раздел per-api limit в docs ), поэтому в общем смысле вам понадобится последовательность вызовов Scan читать все данные из таблицы

2) DynamoDB не поддерживает запросы агрегации, что вы и просили. Это означает, что вы не можете попросить его сгруппировать данные в сегменты для вас, и вы не можете попросить их подсчитать или подсчитать суммы

Итак, вам нужно запустить сканирование без какого-либо фильтра, а затем реализовать группирование и агрегирование в вашем приложении. По сути, это операция сопоставления / уменьшения: сопоставьте элементы, основанные на оценке, в области и уменьшите, используя счетчик для создания гистограмм.

...