Come posso ottenere tutte le chiavi archiviate nella famiglia di colonne Cassandra con pycassa?
Domanda
C'è qualcuno che ha esperienza di lavoro con pycassa Ho un dubbio a riguardo.Come posso ottenere tutte le chiavi archiviate nel database?
beh in questo piccolo frammento dobbiamo fornire le chiavi per ottenere le colonne associate (qui le chiavi sono 'foo' e 'bar'), va bene ma il mio requisito è ottenere tutte le chiavi (solo chiavi) contemporaneamente come elenco Python o struttura dati simile.
cf.multiget(['foo', 'bar'])
{'foo': {'column1': 'val2'}, 'bar': {'column1': 'val3', 'column2': 'val4'}}
Grazie.
Soluzione
Altri suggerimenti
Si può provare: 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])
Ottenere un iteratore sopra le righe in un key range specificato.
miglioramento Minore sulla soluzione di Santhosh
dict(cf.get_range(column_count=0,filter_empty=False)).keys()
Se vi preoccupate per ordine:
OrderedDict(cf.get_range(column_count=0,filter_empty=False)).keys()
get_range restituisce un generatore. Siamo in grado di creare un dict dal generatore e ottenere le chiavi da questo.
COLUMN_COUNT = 0 limita risultati al row_key. Tuttavia, poiché questi risultati non hanno colonne abbiamo anche bisogno filter_empty.
filter_empty = False ci permetterà di ottenere i risultati. Tuttavia righe e fantasmi campo a vuoto può essere incluso nel nostro risultato ora.
Se non ci importa di più in testa, ottenendo solo la prima colonna risolverà le righe vuote e variare i fantasmi.
dict(cf.get_range(column_count=1)).keys()
C'è un problema con Quello di Santhosh E kzarns' risposte, mentre stai portando in memoria un detto potenzialmente enorme che stai immediatamente scartando.Un approccio migliore sarebbe utilizzare le comprensioni delle liste per questo:
keys = [c[0] for c in cf.get_range(column_count=0, filter_empty=False)]
Questo scorre sul generatore restituito da get_range
, mantiene la chiave in memoria e memorizza la lista.
Se l'elenco delle chiavi è potenzialmente troppo grande per tenerlo in memoria tutto in una volta e devi ripetere solo una volta, dovresti usare un espressione del generatore invece di una comprensione di lista:
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!