我需要一个关于设计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集群。
答案 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将自动更新第二个表。