2010-03-12 22 views
6

是否有任何与pycassa合作的经验?我对此表示怀疑。如何获取存储在数据库中的所有密钥?如何获得用pycassa存储在Cassandra列族中的所有密钥?

在这个小片段中,我们需要给键来获得关联的列(这里的键是'foo'和'bar'),这很好,但我的要求是获得所有键键)作为Python列表或类似的数据结构。

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

谢谢。

回答

11

尝试:

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

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

+0

我不会尝试,对于大桌子... – 2013-09-25 10:03:07

+1

似乎与最近的pycassa API改变了一下,但这个工程:[x [0] for col_fam.get_range()] – okigan 2014-03-10 21:18:49

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] 
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返回一个发电机。我们可以从发生器创建一个字典,并从中获取密钥。

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

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

如果我们不介意更多的开销,只获取第一列将解决空行和范围重影。

dict(cf.get_range(column_count=1)).keys() 
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! 
相关问题