如何使用pycassa获取存储在Cassandra列族中的所有密钥?

时间:2010-03-12 04:39:39

标签: python cassandra pycassa

是否有人有使用pycassa的经验我对此有疑问。如何获取存储在数据库中的所有密钥?

在这个小片段中,我们需要提供密钥才能获得相关的列(这里的键是'foo'和'bar'),这很好,但我的要求是获取所有键(只有键) )立即作为Python列表或类似的数据结构。

cf.multiget(['foo', 'bar'])
{'foo': {'column1': 'val2'}, 'bar': {'column1': 'val3', 'column2': 'val4'}}

感谢。

5 个答案:

答案 0 :(得分:11)

尝试:

    list(cf.get_range().get_keys())

这里有更多好东西:http://github.com/vomjom/pycassa

答案 1 :(得分:5)

您可以尝试: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]

答案 2 :(得分:1)

get_range([start][, finish][, columns][, column_start][, column_finish][, column_reversed][, column_count][, row_count][, include_timestamp][, super_column][, read_consistency_level][, buffer_size])

  

获取一个遍历行的迭代器   指定的键范围。

http://pycassa.github.com/pycassa/api/pycassa/columnfamily.html#pycassa.columnfamily.ColumnFamily.get_range

答案 3 :(得分:1)

Santhosh解决方案的小改进

dict(cf.get_range(column_count=0,filter_empty=False)).keys()

如果您关心订单:

OrderedDict(cf.get_range(column_count=0,filter_empty=False)).keys()

get_range返回一个生成器。我们可以从生成器创建一个dict并从中获取密钥。

column_count = 0将结果限制为row_key。但是,因为这些结果没有列,所以我们还需要filter_empty。

filter_empty = False将允许我们获得结果。但是现在我们的结果中可能包含空行和范围重影。

如果我们不介意更多的开销,只获得第一列将解析空行和范围鬼。

dict(cf.get_range(column_count=1)).keys()

答案 4 :(得分:0)

Santhosh'skzarns'答案存在问题,因为您为记忆带来了一个可能会立即丢弃的巨大字典。更好的方法是使用列表推导:

keys = [c[0] for c in cf.get_range(column_count=0, filter_empty=False)]

迭代get_range返回的生成器,将密钥保存在内存中并存储列表。

如果键的列表也可能太大而无法一次性保存在内存中而您只需要迭代一次,则应使用generator expression instead of a list comprehension

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!