关于'validFrom / validTo timestamps'的CQL查询

时间:2014-09-17 10:04:18

标签: cassandra cql

我目前正在尝试为具有两个时间戳的列系列建模,以指定某个条目在给定日期(通常是执行时间)是否有效(或“活动”)。

传统SQL,64 GB RAM和一些索引没有大问题,我们经常使用我们的SQL服务器这样做。

但是,在CQL中,我还没有设法为这种情况建模并为其编写有效的查询。

我的基本模型是(我跳过了PK定义!

create table myTable(
    id uuid,
    validFrom timeuuid,
    validTo timeuuid,
    someInformationalData varChar
);

一些解释:

  • 由于事实上,有效日期不是唯一的,我需要在我的最终应用程序中使用组合密钥,这将是一个用户组参考(将是一个理想的分区密钥)
  • validFrom / To被设计为可选的,但我可以通过使用边界值(1970,2038)来处理' null'通过持久层传递的值

我尝试了各种分区/群集密钥组合,但它们都没有产生有效的CQL

-- only active results
select * 
from
     myTable
where
     validFrom < now()
and
     validTo > now()

我对NoSQL / CQL世界很陌生,并且在转换我们的一些应用程序时遇到了一些麻烦。我可以在记忆中做到这一点,但我担心,这可能会在某些时候出现瓶颈......

不确定这种&#39;我不知道我在做什么&#39;大喊大叫是合适的,但任何形式的帮助都会受到赞赏。 :)

编辑以下是我一直在搞乱的方法之一

drop table if exists myTable;

create table myTable(
    id int,
    datefrom timeuuid,
    dateto timeuuid,
    someColumns varChar,
    primary key((id,datefrom),dateto)
 );

create index if not exists my_idx on myTable(datefrom); 

insert into myTable(id, datefrom,dateto,somecolumns)
values(0,minTimeuuid('1970-01-01 00:00:00'),minTimeuuid('2020-01-01 00:00:00'),'test');
insert into myTable(id,datefrom,dateto,somecolumns)
values(1,minTimeuuid('1970-01-01 00:00:00'),minTimeuuid('2012-01-01 00:00:00'),'test2');


select * from myTable where dateto > now() allow filtering;
-- invalid ("A column of a partition key can be restricted only if the preceding one is restricted by an Equal relation.")
select * from myTable where datefrom < now() and dateto > now()  allow filtering;

第一个查询是限制我的结果,该行包含&#39; validTo = 2012-01-01&#39;被过滤了,但是我无法计算出在where子句中有两个限制的方案。

2 个答案:

答案 0 :(得分:1)

如果我了解您的问题,您正在寻找的是一种基于时间戳运行范围查询的方法。基本上,为了能够这样做,您的模型必须将时间戳组件作为群集密钥的一部分:

create table myTable(
  eventType uuid,
  ts timestamp,
  val text,
  PRIMARY KEY (eventType, ts)
);

以上内容可让您运行如下搜索:SELECT eventType, val from myTable where eventType = 'your_event' and ts >= 'start_ts' and ts < 'end_ts'

您需要记住的是,群集密钥指示磁盘上的顺序,从而可以高效运行上述查询。您可以在CQL spec SELECT section

中详细了解相关详情

答案 1 :(得分:0)

他们就像cassandra中的Now()一样没有任何其他sql数据库。你必须清楚地提到今天的日期而不是现在()..

您可以在where子句中使用您在其中定义为主键或辅助索引的列。