Это наивное решение, так как я не знаю, как ваш случай использование потерпит отклонения в данные из-за последовательной и последовательной семантики 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';