Выбор случайного результата из простой базы данных (SDB) в AWS - PullRequest
1 голос
/ 15 января 2010

Кто-нибудь знает, как это сделать - только то, что будет эквивалентно этому: "выбрать * из YOUR_TABLE по пределу rand () 1" в MySQL ??

Может быть, это невозможно в SDB?

Ответы [ 3 ]

2 голосов
/ 01 февраля 2010

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

1 голос
/ 06 августа 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

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

0 голосов
/ 15 января 2010

Нет, в 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 на запрос), если вы не сохранили несколько токенов NextTok из первого набора запросов.

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

...