Подтвердить что ты не робот

AWS DynamoDB - выбрать запись/элемент случайно?

Любые идеи о том, как выбрать элемент/запись случайным образом из таблицы DynamoDB? Я не верю, что в API есть какие-либо положения.

Я думал о сохранении таблицы NumericId | MyOtherKey ( "NumericIdTable" ), а затем генерировал случайное число между 0 и общим количеством записей, которые у меня есть, а затем получаю этот элемент из NumericIdTable, но он не будет работать в длинном -run.

Мысли/идеи приветствуются.

4b9b3361

Ответ 1

Один из подходов, который я придумал, чтобы выбрать случайный элемент из таблицы DynamoDB:

  • Создайте случайный RangeKey по всем возможным RangeKeys в вашей таблице.
  • Запросить таблицу с помощью этого RangeKey и RangeKeyCondition GreaterThan и ограничение 1

Например, если вы используете UUID в качестве идентификатора для вашего RangeKey, вы можете получить свой случайный элемент следующим образом

RandomRangeKey = new UUID
RandomItem = Query( "HashKeyValue": "KeyOfRandomItems",
                    "RangeKeyCondition": { "AttributeValueList":
                                "RandomRangeKey",
                                "ComparisonOperator":"GT"}, 
                    "Limit": 1 )

Таким образом вы получаете случайный элемент и потребляете только 1 емкость чтения.

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


Если ваш Tabledesign не позволяет рандомизированный RangeKeys, вы можете следовать вашему подходу и создать отдельную таблицу RandomItem и сохранить идентификатор в рандомизированном RangeKey. Возможная структура таблицы для этого была бы

*RandomItemTable
   TableName - HashKey
   UUID - Rangekey
   ItemId

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

Ответ 2

Если вы используете GUID в качестве своего хэш-ключа для таблицы, вы можете сделать что-то вроде этого:

var client = new AmazonDynamoDBClient();

var lastKeyEvaluated = new Dictionary<string, AttributeValue>() 
{ 
    { "YOUR_HASH_KEY", new AttributeValue(Guid.NewGuid().ToString()) } 
};

var request = new ScanRequest()
{
    TableName = YOUR_TABLE_NAME,
    ExclusiveStartKey = lastKeyEvaluated,
    Limit = 1
};
var response = client.Scan(request);

Это даст вам случайную запись каждый раз, так как она генерирует случайный GUID как lastKeyEvaluated.

Ответ 3

Наивный путь был бы 1) использовать описать вызов таблицы, чтобы получить N (общее количество строк) в этой таблице 2) выберите случайное число я между 1 и N 3) сканирование. остановитесь, пока не увидите я строки

Я думаю о лучшем способе сделать это. Я буду обновлять, когда у меня будет хороший ответ.

Ответ 4

Один простой и эффективный способ сделать это:

  1. Получить все предметы на вашем столе. Поскольку у DynamoDB есть предел выборки только 1 МБ данных, используйте ProjectionExpression чтобы получить только ваш первичный ключ раздела в этой операции.
  2. Из приведенного выше результата вы получите общее количество предметов. Теперь просто сгенерируйте случайное число от 0 до количества предметов. Позвольте назвать это случайное число, n.
  3. Из результата в 1 возьмите элемент n -th, который будет значением первичного ключа раздела этого случайного элемента.
  4. Выполните другой запрос DynamoDB со значением ключа первичного раздела только что вычисленного случайного элемента, чтобы получить все необходимые значения столбца.