2013-08-12 2 views
1

Если я таблица определена как:колонке Диапазон запросов в CQL3

CREATE TABLE metrics (
    schedule_id int, 
    time timestamp, 
    value double, 
    PRIMARY KEY (schedule_id, time) 
); 

Это достаточно просто, чтобы выбрать самую последнюю метку времени & значение для одного ключа:

SELECT time, value FROM metrics WHERE schedule_id = 1 ORDER BY time DESC LIMIT 1; 

... но как могу ли я эффективно выбрать последнюю метку времени и значение для каждой строки?

Что-то вроде GROUP BY schedule_id в обычном SQL или запросе диапазона столбца (который больше не поддерживается в CQL 3.)

ответ

0

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

CREATE TABLE latest_metrics (
    metric_name text, 
    schedule_id int, 
    latest_time timestamp, 
    latest_value double, 
    PRIMARY KEY (metric_name, schedule_id) 
); 

При вставке данных в metrics, в то же самое время и записать в latest_metrics (это предполагает, что данные всегда вход в монотонно возрастает время, как из канала в режиме реального времени).

INSERT INTO metrics (schedule_id, time, value) VALUES (?, ?, ?); 
INSERT INTO latest_metrics (metric_name, schedule_id, latest_time, latest_value) 
    VALUES ('WellKnownIdentifier', ?, ?, ?); 

В этом случае, «последний» действительно с точки зрения, когда запись была написана и не фактической временной метки значения поля. Если вы глотаете данные, которые поступают с чередующимися временами, вам, вероятно, придется позаботиться об этом на стороне вашего приложения. Вы также могли бы потенциально использовать новые новые функции Compare-и-Set (CAS) в Cassandra 2.x, но процесс Paxos требуется, чтобы сделать это будет серьезно повлиять на производительность записи:

INSERT INTO latest_metrics (...) VALUES (...) IF latest_time <= ?; 

Если все эти предположения работы для ваших данных вы можете запросить «последнее» значение для всех графиков достаточно легко:

SELECT schedule_id, latest_time, latest_value FROM latest_metrics WHERE metric_name = 'WellKnownIdentifier'; 
Смежные вопросы