Cassandra架构 - 按经常更新的列选择

时间:2017-10-05 02:27:52

标签: cassandra cql cassandra-3.0

给出表:

CREATE TABLE T (
      a int,
      last_modification_time timestamp,
      b int,
     PRIMARY KEY (a)
);

我经常更新记录。每次更新last_modification_time都设置为now(),并且还会设置其他字段。

能够按last_modification_time范围查询的cassandra方法是什么?我需要像这样查询:

  • select * from .. where a=Z and last_modification_time < X and last_modification_time > Y;

一种方法是使用PRIMARY KEY (a, last_modification_time)创建实体化视图,但我想避免这种情况,因为3.X cassandra版本中的实体化视图存在错误

last_modification_time给定last_modification_time范围内的查询替代方法经常更新?

2 个答案:

答案 0 :(得分:0)

有两张桌子怎么样?你可以保存当前快照,你正在更新last_modification_time字段和另一个保存随时间变化的字段(类似历史表)?您可以使用BATCH语句写入它们。

CREATE TABLE t_modifications (
      a int,
      last_modification_time timestamp,
      b int,
     PRIMARY KEY (a, last_modification_time)
) WITH CLUSTERING ORDER BY (last_modificaton_time DESC);

BEGIN BATCH
      UPDATE T SET last_modification_time = 123, b = 4 WHERE a = 2;
      INSERT INTO t_modifications (a, last_modification_time, b) values (2, 123, 4);
APPLY BATCH;

如果您对给定修改范围内的最新快照感兴趣,可以选择并限制t_modifications表:

SELECT * FROM t_modifications WHERE a = 2 AND last_modification_time < 136 LIMIT 1;

答案 1 :(得分:0)

通常,要进行这样的范围查询,要作为范围的字段必须是组合键的一部分,必须是组合键的最右边的元素,以及组合键中的所有其他元素必须指定。在您的情况下,您可以将主键修改为(a,last_modification_time)。然后,您可以

SELECT * from t_modifications 
 WHERE a = aval
   AND last_modification_time > beg
   AND last_modification_time < end;

这将为您提供 begg end 之间的 aval 的所有记录。