2015-03-19 4 views
5

Как написать CQL, чтобы получить самый последний набор данных из каждой строки?CQL с широким рядом - как получить последний набор?

Я изучаю переход от MSSQL к Cassandra и начинаю понимать концепции. Много исследований поможет чрезвычайно, но я не нашел ответ на этот вопрос (я знаю, что должен быть способ):

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 минуту:

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

ожидания 3 минуты:

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

ждать 5 минут:

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

Как написать CQL, чтобы получить самый последний набор данных из каждой строки?

SELECT ID, Title FROM WideRow - дает мне 5 строк, поскольку он меняет данные для меня.

По существу я хочу результаты для (SELECT ID, название от WideRow ГДЕ .....) быть:

ID Title 
aaa, Title3 
bbb, Title2 

Кроме того, есть ли способ, чтобы получить подсчет количества наборов данных в широком ряду?

По существу эквивалент TSQL: SELECT ID, Count (*) FROM Таблица GROUP BY ID

ID Count 
aaa 3 
bbb 2 

Благодаря

Кроме того, любые ссылки, чтобы узнать больше об этих типах запросов будет также иметь в виду, ,

ответ

4

С вашей текущей моделью данных вы можете запрашивать только самую последнюю строку с помощью ключа раздела. В вашем случае это ID.

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

Так как вы указали ваш заказ кластеризации на Updated в убывающем порядок, то строка с наиболее недавно Updated меткой времени будет возвращена первым.

Учитывая желаемые результаты, я продолжу и предполагаю, что вы не хотите запрашивать каждый раздел ключа отдельно. Cassandra поддерживает только набор результатов набора CQL по ключу раздела. Также Cassandra не поддерживает агрегацию. Таким образом, на самом деле нет способа получить «самые последние» для всех ваших ID s одновременно, а также нет способа получить отчет о количестве обновлений, каждый из которых имеет ID.

С помощью моделирования данных Cassandra вам необходимо построить свои таблицы в соответствии с вашими запросами. Запрос «планирование» на самом деле не является сильной стороной Кассандры (как вы узнаете). Чтобы получить самые последние обновления на ID, вам нужно будет создать дополнительную таблицу запросов, предназначенную для хранения только самого последнего обновления для каждого идентификатора. Аналогично, чтобы получить подсчет обновлений для каждого ID, вы можете создать дополнительную таблицу запросов, используя counter coulmns в соответствии с этим запросом.

TL; др

В Кассандре, денормализацию и избыточного хранения данных является ключом. Для некоторых приложений у вас может быть одна таблица для каждого запроса, который вам нужен для поддержки ... и все в порядке.