Команда ,

У меня есть динамодб с заданным хеш-ключом (идентификатором пользователя) и ключом сортировки (возрастом). Допустим, если мы хотим получить элементы в виде вывода «для каждого хэш-ключа (идентификатора пользователя), наименьшего возраста», то каким будет запрос и выражение фильтра для динамо-запроса.

Благодарность!

0
Santhosh 14 Июл 2017 в 19:36

3 ответа

Не думаю, что это можно сделать в запросе. Вам нужно будет выполнить полное сканирование таблицы. Если у вас где-то есть список хеш-ключей, вы можете вместо этого выполнить N запросов (параллельно).

[Обновление] Вот еще один возможный подход: ведите вторую таблицу, где у вас есть только хэш-ключ (userID). Эта таблица будет содержать запись с наименьшим возрастом для данного пользователя. Для этого убедитесь, что каждый раз, когда вы обновляете основную таблицу, вы также обновляете вторую, если новый возраст меньше текущего возраста во второй таблице. Для этого вы можете использовать условное обновление. Обновление может быть выполнено самим приложением или вы можете настроить AWS lambda для прослушивания потока DynamoDB. Теперь, если вам нужен наименьший возраст для каждого использования, вы все равно выполняете полное сканирование второй таблицы, но это сканирование будет читать только соответствующие записи, поэтому оно будет оптимальным.

0
Tofig Hasanov 15 Июл 2017 в 00:12
Как лучше всего реализовать такие варианты использования с помощью Dynamodb? Допустим, хеш-ключи где-то не хранятся.
 – 
Santhosh
14 Июл 2017 в 23:51
Я обновил свой ответ одним возможным подходом. Есть и другие.
 – 
Tofig Hasanov
15 Июл 2017 в 00:12

Этого можно добиться двумя способами:

Если вам не нужно получать эти данные в реальном времени, вы можете экспортировать свои данные в другие системы AWS, например EMR или Redshift < / a> и выполнять там сложные аналитические запросы. Благодаря этому вы можете писать выражения SQL, используя объединения и группировать по операторам.

Вы даже можете выполнять запросы EMR Hive к данным DynamoDB, но они выполняют сканирование, поэтому это не очень рентабельно.

Другой вариант - использовать потоки DynamoDB. Вы можете вести отдельную таблицу, в которой хранятся:

Таблица: Минимальный возраст

UserId - первичный ключ

MinAge - обычный числовой атрибут.

При каждом обновлении / удалении / вставке исходного запроса вы можете запрашивать минимальный возраст для обновленного пользователя и сохранять его в таблице MinAges .

Другой вариант - написать что-то вроде этого:

storeNewAge(userId, newAge)
def smallestAge = getSmallestAgeFor(userId)
storeSmallestAge(userId, smallestAge)

Но поскольку DynamoDB не имеет встроенной поддержки транзакций, запускать подобный код опасно, так как вы можете получить несогласованные данные. Вы можете использовать библиотеку транзакций DynamoDB, но эти транзакции дорогие. Хотя, если вы используете потоки, у вас будут согласованные данные по очень низкой цене.

0
Ivan Mushketyk 24 Июл 2017 в 21:29

Вы можете сделать это с помощью ScanIndexForward

YourEntity requestEntity = new YourEntity();
requestEntity.setHashKey(hashkey);
DynamoDBQueryExpression<YourEntity> queryExpression = new DynamoDBQueryExpression<YourEntity>()
            .withHashKeyValues(requestEntity)
            .withConsistentRead(false);
equeryExpression.setIndexName(IndexName); // if you are using any index
queryExpression.setScanIndexForward(false);
queryExpression.setLimit(1);
0
Lokesh Gupta 28 Июл 2017 в 01:42