2015-08-22 8 views
0

Мне нужно предложение по разработке схемы таблицы Кассандры. я сотворенная таблицу, как это:Предложения схемы схемы Кассандры

CREATE TABLE sams.events (
    addedtime timestamp, 
    hostname text, 
    appname text, 
    eventtime timestamp, 
    PRIMARY KEY (addedtime, hostname) 
) WITH CLUSTERING ORDER BY (hostname ASC) 

Теперь это мои требования:

1) я должен быть в состоянии сделать интервальные запросы с помощью addedtime, как от даты х к у даты

2) Я должен иметь возможность запрашивать имя приложения и заказывать строки в порядке возрастания, используя добавленное время

Как я могу это достичь? Я согласен изменить схему таблицы.

Добавление Я создал кластер Cassandra из 2 DC и 3 узла каждый.

ответ

0

Возможно, вам понадобятся две таблицы для обработки этих запросов.

Чтобы сделать запрос диапазона в добавленное время, вам понадобится таблица, в которой добавленное время будет столбцом кластеризации, а не как ключ раздела, как показано в вашем примере. Это потому, что вы можете выполнять запросы диапазона только при кластеризации столбцов. Так что если вы хотите сделать запрос диапазона для каждого хоста, то вы могли бы иметь имя хоста в качестве ключа секционирования, как это:

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 автоматически обновляет вторую таблицу.

+0

Нехорошо ли иметь добавленное время в качестве ключа раздела и имени хоста в качестве индексированного столбца? – Aftab

+0

Спасибо Джим. Я создал кластер, а мое имя приложения ограничено числом 2. Также я получаю много событий из одного имени приложения. Создание его в качестве ключа раздела приводит к тому, что все записи переходят в один узел Cassandra, какой беспорядок на узле кластера и остальные узлы кассандры легче.Есть ли способ, по которому я могу запрашивать только appname, а мои строки распределяются по узлам accros с одним именем приложения. – Nipun

+0

. Вы можете использовать сложный раздел ключа для добавления мощности, объединив одно из существующих полей с именем приложения или создайте новое поле для это цель. Например, вы можете добавить поле даты для разбиения по именам приложений и дням или имени приложения и случайному числу от 1 до 3 для распространения данных по трем разделам и т. Д. –

1

Вы упомянули, что у вас есть только 2 приложения. Сколько хостов вы имеете, равно или больше, чем количество узлов в кластере? Если да, то вы можете попробовать следующее, которое может дать вам даже распространение данных.

CREATE TABLE mykeyspace.events (
appname text, 
hostname text, 
addedtime timeuuid, 
eventtime timeuuid, 
PRIMARY KEY ((appname, hostname), addedtime) 
); 

insert into events (appname, hostname , addedtime , eventtime) values ('app1','host1',now(), now()); 
insert into events (appname, hostname , addedtime , eventtime) values ('app1','host1',now(), now()); 
insert into events (appname, hostname , addedtime , eventtime) values ('app1','host2',now(), now()); 
insert into events (appname, hostname , addedtime , eventtime) values ('app1','host3',now(), now()); 
insert into events (appname, hostname , addedtime , eventtime) values ('app1','host4',now(), now()); 

Query1: Диапазон запросов на дополнительное время (в надежде ваш номер хоста не выше число, в противном случае он будет большим в пункте)

select * from events where appname = 'app1' and hostname in ('host1','host2') and addedtime > maxTimeuuid('2015-08-23 00:46:00-0500') and addedtime < minTimeuuid('2015-08-23 00:49:19-0500') ; 

Запрос 2: По имени приложения (опять же в надежде ваш номер хоста не выше число)

select appname,hostname,dateOf(addedtime) from events where appname = 'app1' and hostname in ('host1','host2'); 

ПРИМЕЧАНИЕ: в статье не поддерживает упорядочивание данных с помощью запроса.

+0

Спасибо Aravind. – Nipun

Смежные вопросы