2015-03-19 5 views
5

Wie würde ich den CQL schreiben, um den neuesten Satz von Daten aus jeder Zeile zu bekommen?CQL mit einer breiten Reihe - wie man am neuesten Satz kommt?

Ich untersuche Übergang von MSSQL zu Cassandra und fangen an, die Konzepte zu begreifen. Viel Forschung hat enorm helfen, aber ich habe nicht Antwort auf diese Frage gefunden (ich weiß, dass es einen Weg geben muss):

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') 

1 Minute warten:

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

Warte 3 Minuten:

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

5 Minuten warten:

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

Wie würde ich den CQL schreiben, um den neuesten Datensatz aus jeder Zeile zu erhalten?

SELECT ID, Title VON WideRow - gibt mir 5 Zeilen, wie es die Daten für mich dreht.

Grunde möchte ich die Ergebnisse für (SELECT ID, Titel FROM WideRow WHERE .....) sein:

ID Title 
aaa, Title3 
bbb, Title2 

Auch ist es eine Möglichkeit, eine Zählung der Anzahl der Datensätze zu erhalten in einer breiten Reihe?

Im Wesentlichen das Äquivalent von TSQL: SELECT ID, COUNT (*) FROM Tabelle GROUP BY ID

ID Count 
aaa 3 
bbb 2 

Dank

Auch alle Verweise mehr über diese Art von Anfragen auch erkannt werden, würde lernen .

Antwort

4

Mit Ihrem aktuellen Datenmodell können Sie nur die letzte Zeile nach Partitionsschlüssel abfragen. In Ihrem Fall ist das ID.

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

Da Sie Ihren Clustering, um auf Updated in absteigender Reihenfolge angegeben haben, wird die Reihe mit den Macht der letzten Updated Zeitstempeln wird zuerst zurückgegeben werden.

Angesichts Ihrer gewünschten Ergebnisse, gehe ich voraus und gehe davon aus, dass Sie nicht jeden Partitionsschlüssel einzeln abfragen wollen. Cassandra verwaltet nur die CQL-Ergebnismengenreihenfolge nach Partitionsschlüssel. Auch Cassandra unterstützt keine Aggregation. So gibt es wirklich keine Möglichkeit, die "neuesten" für alle Ihre ID s zusammen zu bekommen, noch gibt es eine Möglichkeit, einen Bericht zu erhalten, wie viele Updates jede ID hat.

Mit Cassandra Datenmodellierung müssen Sie Ihre Tabellen nach Ihren Anforderungen erstellen. Abfrage "Planung" ist nicht wirklich ein starker Punkt von Cassandra (wie Sie herausfinden). Um die neuesten Updates von ID zu erhalten, müssten Sie eine zusätzliche Abfragetabelle erstellen, die nur das neueste Update für jede ID speichern soll. Um die Anzahl der Updates für jede ID zu erhalten, können Sie auch eine zusätzliche Abfragetabelle erstellen, die counter coulmns für diese Abfrage verwendet.

tl; dr

In Cassandra, Denormalisierung und redundante Datenspeicherung ist der Schlüssel. Für einige Anwendungen haben Sie möglicherweise eine Tabelle für jede Abfrage, die Sie unterstützen müssen ... und das ist in Ordnung.

Verwandte Themen