Выбор случайного результата из простой базы данных (SDB) на AWS

Кто-нибудь знает, как это сделать - что было бы эквивалентно этому: "выберите * из ВАШЕЙ_ТАБЛИЦЫ order by rand () limit 1" в mysql ??

Может, в SDB нет возможности?


person Brig    schedule 15.01.2010    source источник


Ответы (3)


Я действительно говорил об этом с представителем Amazon. Что вы должны сделать, так это сохранить случайное значение вместе с вашими данными в SDB. Когда вы хотите вернуть строку, вы генерируете другое случайное значение и выбираете первый результат меньше этого. Таким образом, вам нужно сохранить немного больше данных, но для этого потребуется всего один запрос.

person Justin    schedule 01.02.2010
comment
Хотя подход, безусловно, является допустимым, я вижу один возможный и один крайний случай, о котором кто-то, использующий этот метод, должен, по крайней мере, знать: 1. Второй запрос потребуется, если рандомизированный селектор меньше самого низкого случайного атрибута в элементе в домен. 2. Поскольку размер промежутков между случайными атрибутами не будет хорошим и даже (если у вас много элементов) не все элементы будут выбраны с равной вероятностью. - person Kevin Loney; 05.08.2011

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

Generate a random value
Generate a random boolean
If the boolean is true {
  Select the first item with a randomizer less than or equal to the random value
}
otherwise {
  Select the first item with a randomizer greater than or equal to the random value
}
Generate a new random value
Set the selected items randomizer to the new random value

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

person Community    schedule 06.08.2011

Нет, в SimpleDB нет случайных функций. Вам придется реализовать случайную часть самостоятельно.

Вы можете сделать что-то вроде:

count = sdb.select("select count(*) from YOUR_TABLE")
random = (rand() * count) + 1
nextToken = sdb.select("select count(*) from YOUR_TABLE limit " + random)
item = sdb.select("select * from YOUR_TABLE limit 1" , nextToken)

Но для этого требуется как минимум три запроса. Первый придется повторять до тех пор, пока вы не получите полный счет (без NextToken). Вторую нужно повторять до тех пор, пока вы не достигнете числа случайных (2500 на запрос максимум), если вы не сохранили несколько NextTokens из первого набора запросов.

В целом не очень удобно.

person Mocky    schedule 15.01.2010
comment
Хм - вообще не получается получить результат nextToken из SDB ... написал об этом здесь: stackoverflow.com/questions/1795245/ есть какие-нибудь советы? - person Brig; 18.01.2010