Cassandra数据建模:时间戳作为分区键

时间:2019-03-07 14:24:44

标签: cassandra cassandra-3.0

我需要能够返回在指定间隔内执行操作的所有用户。 Cassandra中的表定义如下:

create table t ( timestamp from, timestamp to, user text, PRIMARY KEY((from,to), user))

我正在尝试在Cassandra中实现以下查询:

select * from t WHERE from > :startInterval and to < :toInterval

但是,该查询显然无法工作,因为它表示对分区键的范围查询,这迫使Cassandra搜索群集中的所有节点,从而失去了作为高效数据库的目的。

在Cassandra中是否可以有效地对此查询进行建模?

我的解决方案是将两个时间戳分别划分为相应的年份和月份,并将它们用作分区键。该表将如下所示:

 create table t_updated ( yearFrom int, monthFrom int,yearTo int,monthTo int, timestamp from, timestamp to, user text, PRIMARY KEY((yearFrom,monthFrom,yearTo,monthTo), user) )

如果我希望在2017年1月至2017年7月之间执行了该操作的用户,查询将如下所示:

select user from t_updated where yearFrom IN (2017) and monthFrom IN (1,2,3,4,5,6,7) and yearTo IN (2017) and  monthTo IN (1,2,3,4,5,6,7)

是否有更好的方法在Cassandra中为该查询建模?您将如何处理这个问题?

2 个答案:

答案 0 :(得分:1)

答案取决于预期的条目数。经验法则是分区不应超过100mb。因此,如果您希望输入的条目数量适中,那么将year作为分区键就足够了。

在物联网场景中,我们将“每周优先日期”用作分区键,在这种情况下,每分钟最多写入一次值。

答案 1 :(得分:1)

首先,分区键​​必须在equals运算符上进行操作。最好在这里使用PRIMARY KEY(BUCKET,TIME_STAMP),其中Bucket可以是年,月(或包括天,小时等,取决于数据集的大小)的组合。

最好执行多个查询并将结果合并到客户端。

相关问题