2010-03-12 12 views
6

¿Alguien tiene experiencia trabajando con pycassa? Tengo una duda con eso. ¿Cómo obtengo todas las claves que están almacenadas en la base de datos?¿Cómo obtengo todas las claves que están almacenadas en la familia de columnas de Cassandra con pycassa?

Bueno, en este pequeño fragmento necesitamos dar las claves para obtener las columnas asociadas (aquí las teclas son 'foo' y 'bar'), eso está bien, pero mi requisito es obtener todas las claves (solo teclas) a la vez como lista de Python o estructura de datos similar.

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

Thanks.

Respuesta

11

intento:

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

más cosas buenas aquí: http://github.com/vomjom/pycassa

+0

Yo no trataría de que para una Mesa grande... –

+1

parece que la API reciente de pycassa ha cambiado un poco, pero esto funciona: [x [0] para x en col_fam.get_range()] – okigan

5

Usted puede tratar de: 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

pequeña mejora en la solución de Santhosh

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

Si se preocupan por orden:

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

get_range devuelve un generador. Podemos crear un dict del generador y obtener las claves de eso.

column_count = 0 limita los resultados a row_key. Sin embargo, como estos resultados no tienen columnas, también necesitamos filter_empty.

filter_empty = False nos permitirá obtener los resultados. Sin embargo, las filas vacías y los fantasmas de rango pueden incluirse en nuestro resultado ahora.

Si no nos importa más sobrecarga, obtener solo la primera columna resolverá las filas vacías y los fantasmas de rango.

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

Hay un problema con Santhosh's y kzarns' respuestas, ya que usted está trayendo en memoria de una potencialmente enorme dict que usted va a desechar inmediatamente. Un mejor enfoque sería el uso de listas por comprensión para esto:

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

Este itera sobre el generador devuelto por get_range, guarda la llave en la memoria y almacena la lista.

Si la lista de claves, donde también potencialmente demasiado grande para mantenerlo en la memoria de una vez y sólo tendrá que repetir una vez, usted debe utilizar 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! 
Cuestiones relacionadas