Запросите DynamoDB для последней записи каждого ключа - PullRequest
0 голосов
/ 24 августа 2018

У меня есть таблица DynamoDB, где я храню события датчика.

  • HASH KEY: идентификатор датчика

  • КЛЮЧ ДИАПАЗОНА: отметка времени

  • информация о датчике

Теперь мне нужен запрос для последнего события каждого датчика.

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

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Вы должны решить, что для вас важно, и составить таблицу (таблицы) в соответствии с вашими вариантами использования.

Вы говорите, что хотите запросить последнее значение для каждого датчика и что имеется более 2000 датчиков. Что вы будете делать с этими значениями 2000+? Как часто вам нужны эти значения и могут ли они быть немного устаревшими?

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

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

Однако, если вы обновляете все датчики одновременно, то дальнейшая оптимизация может быть достигнута путем объединения нескольких показаний датчиков в один элемент, поэтому требуется меньше записей для обновления всех 2000 из них.

0 голосов
/ 24 августа 2018

Поскольку вы определили range_key, вы можете получить последний элемент, используя Query(hash_key=HASH_KEY, ScanIndexForward=True, limit=1)

...