Cassandra架构表建议

时间:2015-08-22 16:37:08

标签: cassandra

我需要一个关于设计Cassandra表模式的建议。 我创建了一个这样的表:

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

现在这些是我的要求:

1)我应该可以通过添加时间进行范围查询,例如从x date到y date

2)我应该能够通过appname进行查询,并使用addedtime

按升序对行进行排序

我怎样才能做到这一点?我可以更改表模式。

添加我创建了2个DC和3个节点的Cassandra集群。

1 个答案:

答案 0 :(得分:0)

您可能需要两个表来处理这些查询。

要对添加时间进行范围查询,您需要一个表,其中addedtime是一个聚类列,而不是您在示例中显示的分区键。这是因为您只能对群集列进行范围查询。因此,如果要对每个主机名执行范围查询,则可以将主机名作为分区键,如下所示:

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作为分区键的表,并将additionaltime作为聚类列,如下所示:

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中,您将能够创建第二个表作为第一个表的视图。然后,当您修改第一个表时,Cassandra将自动更新第二个表。