Как мне получить все ключи, хранящиеся в семействе столбцов Cassandra, с помощью pycassa?
Вопрос
Есть ли у кого опыт работы с пикасса У меня есть сомнения по этому поводу.Как мне получить все ключи, которые хранятся в базе данных?
ну, в этом небольшом фрагменте нам нужно указать ключи, чтобы получить связанные столбцы (здесь ключи - «foo» и «bar»), это нормально, но мое требование - получить все ключи (только ключи) одновременно как список Python или аналогичная структура данных.
cf.multiget(['foo', 'bar'])
{'foo': {'column1': 'val2'}, 'bar': {'column1': 'val3', 'column2': 'val4'}}
Спасибо.
Решение
пытаться:
list(cf.get_range().get_keys())
еще больше хорошего здесь: http://github.com/vomjom/pycassa
Другие советы
Можешь попробовать: cf.get_range(column_count=0,filter_empty=False)
.
# Since get_range() returns a generator - print only the keys.
for value in cf.get_range(column_count=0,filter_empty=False):
print value[0]
get_range([start][, finish][, columns][, column_start][, column_finish][, column_reversed][, column_count][, row_count][, include_timestamp][, super_column][, read_consistency_level][, buffer_size])
Получите итератор над рядами в указанном диапазоне ключей.
Незначительное улучшение решения Сантоша
dict(cf.get_range(column_count=0,filter_empty=False)).keys()
Если вы заботитесь о заказе:
OrderedDict(cf.get_range(column_count=0,filter_empty=False)).keys()
get_range возвращает генератор.Мы можем создать словарь из генератора и получить от него ключи.
columns_count=0 ограничивает результаты row_key.Однако, поскольку в этих результатах нет столбцов, нам также нужен filter_empty.
filter_empty=False позволит нам получить результаты.Однако теперь в наш результат могут быть включены пустые строки и призраки диапазонов.
Если мы не возражаем против увеличения накладных расходов, получение только первого столбца устранит пустые строки и призраки диапазона.
dict(cf.get_range(column_count=1)).keys()
Есть проблема с Сантоша и кзарны ответы, поскольку вы запоминаете потенциально огромный текст, который сразу же отбрасываете.Лучшим подходом было бы использовать для этого понимание списка:
keys = [c[0] for c in cf.get_range(column_count=0, filter_empty=False)]
Это перебирает генератор, возвращаемый get_range
, сохраняет ключ в памяти и сохраняет список.
Если список ключей потенциально слишком велик, чтобы хранить его в памяти сразу, и вам нужно выполнить только одну итерацию, вам следует использовать выражение генератора вместо понимания списка:
kgen = (c[0] for c in cf.get_range(column_count=0, filter_empty=False))
# you can iterate over kgen, but do not treat it as a list, it isn't!