Как сделать запрос записей, где datetime больше, чем X в DynamoDB? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть таблица в DynamoDB, и мне нужно получить список записей (на Java), которые относятся к последнему дню. Все они имеют атрибут dateTime.

Соответствующие атрибуты таблицы, на которую я ссылаюсь: customerUrl (строка, хэш-ключ), dateTime (число, ключ диапазона) и некоторые другие атрибуты, которые не имеют отношения

Я уже пытался установить глобальный вторичный индекс с помощью хеш-ключа dateTime и без ключа диапазона. Этот индекс называется «performanceIndex». Затем я попытался сделать запрос следующим образом:

Map<String, AttributeValue> eav = new HashMap<>();
eav.put(":val1", new AttributeValue().withN(maximumAgeMillis));
DynamoDBQueryExpression<PingLog> pinglogQuery = new DynamoDBQueryExpression<PingLog>();
pinglogQuery.setKeyConditionExpression("dateTime > :val1");
pinglogQuery.setExpressionAttributeValues(eav);
pinglogQuery.setIndexName("performanceIndex");
pinglogQuery.setConsistentRead(false);
List<PingLog> pinglogs = PostDatabaseMapper.getInstance().query(PingLog.class, pinglogQuery);

Однако запрос постоянно работает и никогда не возвращается. Я добавил оператор println до и после него, и только первый из них был напечатан.

До этого запроса я только что сделал сканирование с фильтром, и это сработало, но теперь у нас так много записей (80 миллионов), что сканирование занимает вечность. Что я должен делать? Нужен ли мне другой вторичный индекс? Мой запрос неверен?

1 Ответ

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

Вы должны создать GSI с yyyy-mm-dd в качестве ключа раздела и hh:mm:ss в качестве ключа сортировки. (Для этого может потребоваться заполнение всей таблицы, но если вы будете часто делать запросы по дате, это будет стоить того.) Проверьте этот ответ на связанный вопрос, в котором есть некоторые подробности об этом подходе.

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

Если вы имеете дело с данными временных рядов, такими как показания датчика IoT, эта стратегия может не сработать для вас. У вас может быть горячий раздел в GSI, который может оказать обратное давление в вашей основной таблице и привести к ограничению записи. Это маловероятно из-за адаптивных возможностей DynamoDB, но это возможно.

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

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