2009-12-23 15 views
44

C'è un modo per ottenere un conteggio di righe (conteggio chiavi) di una singola famiglia di colonne in Cassandra? get_count può essere utilizzato solo per ottenere il conteggio delle colonne.Conteggio righe di una famiglia di colonne in Cassandra

Ad esempio, se ho una famiglia di colonne contenente utenti e desideravo ottenere il numero di utenti. Come potrei farlo? Ogni utente è la propria riga.

risposta

-3

Ho ottenuto i conteggi in questo modo dopo aver convertito i dati in un hash in PHP.

+3

Che chiaramente non scala, poiché ad un certo punto l'hash non si adatta più (utilmente) alla ram di PHP. Cassandra è per cose scalabili. – MarkR

+0

Lo so - questo è ciò che mi preoccupa. Sono ancora in fase di sviluppo e sto cercando una soluzione migliore per problemi come questo. –

6

Se si utilizza un partizionatore per la conservazione degli ordini, è possibile farlo con get_range_slice o get_key_range.

In caso contrario, sarà necessario memorizzare gli ID utente in una riga speciale.

+3

Cosa succede se ho milioni di righe? get_range_slice si sente abbastanza pesante per un'operazione di conteggio semplice. Ho ragione? –

+4

Hai ragione, il conteggio degli oggetti grezzi è relativamente costoso nei sistemi distribuiti rispetto a quello a cui sei abituato su un sistema che può semplicemente mantenere un indice nella memoria locale. – jbellis

2

[Edit: Questa risposta non è aggiornato come di Cassandra 0.8.1 - si prega di vedere il Counters entry nel Cassandra Wiki per il modo corretto di gestire le colonne contatore in Cassandra.]

Sono nuovo di Cassandra, ma ho fatto molto casino con App Engine di Google. Se nessuna altra soluzione si presenta, si può considerare di tenere un contatore separato in una piattaforma che supporta operazioni di incremento atomico come memcached. So che Cassandra sta lavorando sulla funzionalità di incremento/decremento del contatore atomico, ma non è ancora pronta per il prime time.

Posso solo postare un collegamento ipertestuale perché sono nuovo, quindi per i progressi sul supporto contatore vedere il collegamento nel mio commento qui sotto.

Si noti che questa discussione suggerisce ZooKeeper, memcached e redis come possibili soluzioni. La mia preferenza personale verrebbe memorizzata.

http://www.mail-archive.com/[email protected]/msg03965.html

+2

https://issues.apache.org/jira/browse/CASSANDRA-1072 per i progressi nel supporto di Cassandra. –

+0

CounterColumn è ora supportato in 0.8.1 e oltre – Bamboo

+0

Grazie, Bamboo. Questa è una risposta piuttosto vecchia e il mio lavoro con Cassandra è cessato nei primi mesi del 2011. Aggiungerò comunque un collegamento. –

0

C'è sempre Map/Reduce ma che probabilmente va da sé. Se lo hai con hive o suino, puoi farlo per qualsiasi tabella attraverso il cluster anche se non sono sicuro che i tasktrackers conoscano la località cassandra e quindi potrebbe dover eseguire lo streaming dell'intera tabella attraverso la rete in modo da ottenere tracker di attività su cassandra nodi ma i dati che ricevono possono provenire da un altro nodo Cassandra :(Mi piacerebbe sentire se qualcuno lo sa per certo.

NOTA: Stiamo impostando la mappa/riduci su cassandra principalmente perché se vogliamo un indice più tardi ., siamo in grado di mappare/ridurre l'uno nell'altro cassandra

37

Se si sta lavorando su un grande insieme di dati e sono a posto con una buona approssimazione, mi consiglia di utilizzare il comando:

nodetool --host <hostname> cfstats 

Questo dump di una lista per ogni famiglia colonna di simile a questo:

Column Family: widgets 
SSTable count: 11 
Space used (live): 4295810363 
Space used (total): 4295810363 
Number of Keys (estimate): 9709824 
Memtable Columns Count: 99008 
Memtable Data Size: 150297312 
Memtable Switch Count: 434 
Read Count: 9716802 
Read Latency: 0.036 ms. 
Write Count: 9716806 
Write Latency: 0.024 ms. 
Pending Tasks: 0 
Bloom Filter False Postives: 10428 
Bloom Filter False Ratio: 1.00000 
Bloom Filter Space Used: 18216448 
Compacted row minimum size: 771 
Compacted row maximum size:
Compacted row mean size: 1634 

Il "Numero di tasti (stima)" Row è una buona congettura all'interno del cluster e la performance è molto più veloce di esplicito contare gli approcci.

+3

Il numero di chiavi non è una stima per quel particolare nodo, non l'intero cluster? –

+0

Sì, lo è. Il nodetool contatta ColumnFamilyStoreMBean che utilizza ColumnFamilyStore, che utilizza DataTracker, che restituisce la somma delle stime create da ciascun SSTable locale. –

+3

'nodetool --host cfstats' mi dà https://gist.github.com/cdwijayarathna/e6b4d3d7d8c272fcfd24, ma non c'è nessun attributo 'Numero di chiavi', qual è la ragione per questo? –

6

Ho trovato un ottimo articolo su questo qui .. http://www.planetcassandra.org/blog/post/counting-keys-in-cassandra

select count (*) dal limite cf 1000000

Sopra dichiarazione può essere usato se ci sono un approssimativo limite superiore conosciuto prima mano. Ho trovato questo utile per il mio caso.

+5

Soluzione non valida: su tabelle grandi avrai rpc_timeout, perché eseguirà la scansione di tutte le tabelle – Vlad

Problemi correlati