Возможно, вам понадобятся две таблицы для обработки этих запросов.
Чтобы сделать запрос диапазона в добавленное время, вам понадобится таблица, в которой добавленное время будет столбцом кластеризации, а не как ключ раздела, как показано в вашем примере. Это потому, что вы можете выполнять запросы диапазона только при кластеризации столбцов. Так что если вы хотите сделать запрос диапазона для каждого хоста, то вы могли бы иметь имя хоста в качестве ключа секционирования, как это:
CREATE TABLE sams.events_by_hostname (
addedtime timestamp,
hostname text,
appname text,
eventtime timestamp,
PRIMARY KEY (hostname, addedtime));
SELECT * FROM events_by_hostname WHERE hostname='host1'
AND addedtime >= '2015-08-22 14:00:39-0400' AND addedtime < '2015-08-22 14:00:41-0400';
hostname | addedtime | appname | eventtime
----------+--------------------------+---------+--------------------------
host1 | 2015-08-22 14:00:39-0400 | app1 | 2015-08-22 14:00:39-0400
запрос по APPNAME, вы хотите таблицу с APPNAME в качестве ключа секционирования и addedtime как столбец кооперирования, как это:
CREATE TABLE sams.events_by_appname (
addedtime timestamp,
hostname text,
appname text,
eventtime timestamp,
PRIMARY KEY (appname, addedtime));
SELECT * from events_by_appname WHERE appname='app1';
appname | addedtime | eventtime | hostname
---------+--------------------------+--------------------------+----------
app1 | 2015-08-22 14:06:45-0400 | 2015-08-22 14:06:45-0400 | host1
app1 | 2015-08-22 14:09:33-0400 | 2015-08-22 14:09:33-0400 | host1
Чтобы сохранить эти две таблицы последовательны, вы можете сделать ваши вставки, используя партию, как это:
BEGIN BATCH
INSERT INTO events_by_hostname (hostname, addedtime, appname, eventtime)
VALUES ('host1', dateof(now()), 'app2', dateof(now()));
INSERT INTO events_by_appname (hostname, addedtime, appname, eventtime)
VALUES ('host1', dateof(now()), 'app2', dateof(now()));
APPLY BATCH;
В Cassandra 3.0, который Су будет n в бета-версии, вы сможете создать вторую таблицу в виде первой таблицы. Затем, когда вы изменяете первую таблицу, Cassandra автоматически обновляет вторую таблицу.
Нехорошо ли иметь добавленное время в качестве ключа раздела и имени хоста в качестве индексированного столбца? – Aftab
Спасибо Джим. Я создал кластер, а мое имя приложения ограничено числом 2. Также я получаю много событий из одного имени приложения. Создание его в качестве ключа раздела приводит к тому, что все записи переходят в один узел Cassandra, какой беспорядок на узле кластера и остальные узлы кассандры легче.Есть ли способ, по которому я могу запрашивать только appname, а мои строки распределяются по узлам accros с одним именем приложения. – Nipun
. Вы можете использовать сложный раздел ключа для добавления мощности, объединив одно из существующих полей с именем приложения или создайте новое поле для это цель. Например, вы можете добавить поле даты для разбиения по именам приложений и дням или имени приложения и случайному числу от 1 до 3 для распространения данных по трем разделам и т. Д. –