我想在Cassandra中存储有关某些事件的信息。事件具有不同的组,并且还按时间间隔分组(组ID =分区键,间隔=聚类键)。事件具有id并且在每个组中我只想存储具有唯一id的事件。我认为使用集合并在其中存储事件ID。像这样:
group id (PK) | time (CK) | event ids
1 | 13:00 | {0, 2, 4, 5}
1 | 14:00 | {1, 3}
1 | 15:00 | {}
2 | 13:00 | {}
2 | 14:00 | {2, 4}
当我选择请求时,我希望在某个时间范围内获取特殊组的事件计数。对于时间范围1
13:00 - 15:00
的组将是下一个
13:00 - 4
14:00 - 2
15:00 - 0
我可以为时间范围1
选择组13:00 - 15:00
的所有事件集并计算他们的一面。它可以工作,但事件设置可以足够大,我不需要有关事件ID的信息(我只存储它的唯一性),只有它们的大小。我可以使用CQL在Cassandra端获得套装尺寸吗?
答案 0 :(得分:0)
不要将数据用于大量数据
Collection(Set):collection collection:2B(231);值大小:65535(216-1)(Cassandra 2.1及更高版本,使用本机协议v3)
而是将event_id放在主键中。
CREATE TABLE events(
group_id bigint,
time bigint,
event_id bigint,
PRIMARY KEY(group_id,time,event_id)
);
您可以插入如下数据:
INSERT INTO events (group_id , time , event_id ) VALUES ( 1, 13, 0);
您可以像这样查询:
SELECT * FROM events WHERE group_id = 1;
它将返回组中的所有事件。
group_id | time | event_id
----------+------+----------
1 | 13 | 0
1 | 13 | 1
1 | 14 | 2
使用Spark或Write程序按计数查找组。
或者使用这些查询中的任何一个来计算。
SELECT group_id,time,count(*) FROM events WHERE group_id = 1 AND time = 13; // To count in a group and time
SELECT group_id,time,count(*) FROM events WHERE group_id = 1 AND time >= 13 AND time <= 14; // To count in a group between time 13 to 14.
来源:https://docs.datastax.com/en/cql/3.1/cql/cql_reference/refLimits.html