2015-03-19 14 views
5

Come scrivere il CQL per ottenere il set di dati più recente da ciascuna riga?CQL con una riga larga - come ottenere il set più recente?

Sto studiando la transizione da MSSQL a Cassandra e sto iniziando a cogliere i concetti. Un sacco di ricerca ha aiutare moltissimo, ma non ho trovato risposta a questo (so che ci deve essere un modo):

CREATE TABLE WideData { 
ID text, 
Updated timestamp, 
Title text, 
ReportData text, 
PRIMARY KEY (ID, Updated) 
} WITH CLUSTERING ORDER (Updated DESC) 

INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('aaa', NOW, 'Title', 'Blah blah blah blah') 
INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('bbb', NOW, 'Title', 'Blah blah blah blah') 

attendere 1 minuto:

INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('bbb', NOW, 'Title 2', 'Blah blah blah blah') 

attendere 3 minuti:

INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('aaa', NOW, 'Title 2', 'Blah blah blah blah') 

attendere 5 minuti:

INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('aaa', NOW, 'Title 3', 'Blah blah blah blah') 

Come scrivere il CQL per ottenere il set di dati più recente da ciascuna riga?

ID SELECT, Titolo FROM WideRow - mi dà 5 righe, mentre ruota i dati per me.

In sostanza voglio i risultati (ID SELECT, Titolo FROM WHERE WideRow .....) da:

ID Title 
aaa, Title3 
bbb, Title2 

Inoltre, c'è un modo per ottenere un conteggio del numero di set di dati in una vasta fila?

In sostanza l'equivalente di TSQL: SELECT MATR, COUNT (*) FROM Tabella GROUP BY ID

ID Count 
aaa 3 
bbb 2 

Grazie

Inoltre, tutti i riferimenti per ulteriori informazioni su questi tipi di query sarebbe anche apprezzato .

risposta

4

Con il modello dati corrente, è possibile interrogare solo la riga più recente per chiave di partizione. Nel tuo caso, è ID.

SELECT ID, Title FROM WideData WHERE ID='aaa' LIMIT 1 

Dal momento che hai indicato l'ordine di clustering su Updated in ordine decrescente, la riga con la più recente-Updated timestamp saranno restituiti prima.

Dati i risultati desiderati, procedo e presumo che non si desideri interrogare singolarmente ciascuna chiave di partizione. Cassandra mantiene solo l'ordine dei set di risultati CQL per chiave di partizione. Anche Cassandra non supporta l'aggregazione. Quindi non c'è davvero modo di ottenere il "più recente" per tutti i tuoi ID insieme, né c'è un modo per ottenere un rapporto di quanti aggiornamenti ha ogni ID.

Con la modellazione dati Cassandra, è necessario creare le tabelle in base alle proprie esigenze. Query "pianificazione" non è davvero un punto di forza di Cassandra (come stai scoprendo). Per ottenere gli aggiornamenti più recenti da ID, è necessario creare una tabella di query aggiuntiva progettata per archiviare solo l'aggiornamento più recente per ciascun ID. Allo stesso modo, per ottenere il conteggio degli aggiornamenti per ogni ID, è possibile creare una tabella di query aggiuntiva utilizzando counter coulmns per soddisfare tale query.

tl; dr

In Cassandra, denormalizzazione e memorizzazione dati ridondanti è la chiave. Per alcune applicazioni, potresti avere una tabella per ogni query che devi supportare ... e va bene.