2010-03-12 7 views
6

Est-ce que quelqu'un ayant de l'expérience de travail avec pycassa J'ai un doute avec elle. Comment puis-je obtenir toutes les clés qui sont stockées dans la base de données?Comment puis-je obtenir toutes les clés qui sont stockées dans la famille de colonnes Cassandra avec pycassa?

bien dans ce petit extrait nous devons donner les clés afin d'obtenir les colonnes associées (ici les touches sont 'foo' et 'bar'), c'est bien mais mon exigence est d'obtenir toutes les clés (seulement keys) à la fois en tant que liste Python ou structure de données similaire.

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

Merci.

Répondre

11

essayer:

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

plus de bonnes choses ici: http://github.com/vomjom/pycassa

+0

je ne voudrais pas essayer de grande table... –

+1

semble avec pycassa api récente a changé un peu, mais cela fonctionne: [x [0] pour x dans col_fam.get_range()] – okigan

5

Vous pouvez essayer: 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

Amélioration mineure sur la solution

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

de Santhosh Si vous vous souciez de commande:

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

get_range retourne un générateur. Nous pouvons créer une dict du générateur et obtenir les clés de cela. Column_count = 0 limite les résultats à la variable row_key.

Cependant, comme ces résultats n'ont pas de colonnes, nous avons aussi besoin de filter_empty.

filter_empty = Faux nous permettra d'obtenir les résultats. Cependant, les lignes vides et les fantômes de portée peuvent être inclus dans notre résultat maintenant.

Si cela ne nous dérange pas plus de frais généraux, obtenir seulement la première colonne résoudra les lignes vides et les fantômes de la gamme.

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

Il y a un problème avec Santhosh's et kzarns' réponses, que vous apportez à la mémoire d'un dict potentiellement énorme que vous immédiatement mise au rebut. Une meilleure approche serait en utilisant la liste compréhensions pour cela:

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

Cette itère sur le générateur retourné par get_range, garde la clé dans la mémoire et stocke la liste.

Si la liste des clés où aussi potentiellement trop grand pour le garder en mémoire à la fois et il vous suffit d'itérer une fois, vous devez utiliser un 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! 
Questions connexes