Кассандра/Пикасса: получение случайных строк

Есть ли возможность получить случайные строки из Cassandra (используя ее с Python/Pycassa)?

Обновление: под случайными строками я подразумеваю случайно выбранные строки!


person Bernhard Vallant    schedule 05.03.2012    source источник


Ответы (3)


Возможно, вы сможете сделать это, выполнив запрос get_range со случайным ключом start (просто случайная строка) и row_count из 1.

По памяти я думаю, что ключ finish должен быть таким же, как start, чтобы запрос «обтекал» пространство ключей; обычно возвращаются все строки, но row_count ограничивает это.

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

person DNA    schedule 05.03.2012
comment
Насколько я могу судить, это будет возвращать случайные строки, но всегда одно и то же... Думаю, для этого нет простого решения с использованием Cassandra... - person Bernhard Vallant; 05.03.2012
comment
Вам нужно будет продолжать вызывать get_range с новым случайным стартовым ключом каждый раз... это должно выбирать строку из случайной точки в кольце пространства ключей. - person DNA; 05.03.2012
comment
Привет, я тоже новичок в Cassandra, но у меня плохое предчувствие по поводу этого ответа. Даст ли это вам равномерное распределение? Похоже, что в зависимости от того, как распределены ваши ключи, некоторые строки могут быть выбраны с большей вероятностью, чем другие. - person Mike Daniels; 07.03.2012
comment
Ключ будет хеширован Cassandra, так что это должно обеспечить хорошее распределение токенов по пространству ключей — это часть дизайна. Вам нужно убедиться, что ваши входные ключи не повторяются слишком часто - я бы предложил использовать Math.Random() для генерации некоторых байтов. - person DNA; 07.03.2012

Не уверен, что вы подразумеваете под случайными строками. Если вы имеете в виду строки с произвольным доступом, то, конечно, вы можете сделать это очень легко:

import pycassa.pool
import pycassa.columnfamily

pool = pycassa.pool.ConnectionPool('keyspace', ['localhost:9160']
cf = pycassa.columnfamily.ColumnFamily(pool, 'cfname')
row = cf.get('row_key')

Это даст вам любую строку. Если вы имеете в виду, что вам нужна случайно выбранная строка, я не думаю, что вы сможете сделать это очень легко, не зная, что такое ключи. Вы можете создать строку индекса, а затем выбрать из нее случайный столбец и использовать его для получения строки из другого семейства столбцов. По сути, вам нужно создать новую строку, в которой каждое значение столбца является ключом строки из семейства столбцов, из которого вы пытаетесь выбрать строку. Затем вы можете случайным образом выбрать столбец из этой строки, и у вас есть ключ к случайной строке.

Я не думаю, что pycassa предлагает какую-либо поддержку для захвата случайной неиндексированной строки.

person turtlebender    schedule 05.03.2012

Это работает для моего случая:

ini = random.randint(0, 999999999)
rows = col_fam.get_range(str(ini), row_count=1, column_count=0,filter_empty=False)

Вам придется адаптироваться к типу ключа строки (строка в моем случае)

person tremendows    schedule 03.12.2012