Cassandra甚至在查询中提到了所有分区键后也要求允许过滤



我一直在尝试在Cassandra中对数据进行建模,并试图根据日期过滤数据,正如SO上的答案所给出的那样,这里的第二个答案没有使用允许过滤器。

这是我当前的模式,

CREATE TABLE Banking.BankData(acctID TEXT, 
email TEXT, 
transactionDate Date , 
transactionAmount double ,
balance DOUBLE, 
currentTime timestamp , 
PRIMARY KEY((acctID, transactionDate), currentTime ) 
WITH CLUSTERING ORDER BY (currentTime DESC);

现在已经通过插入数据

INSERT INTO banking.BankData(acctID, email, transactionDate, transactionAmount, balance, currentTime) values ('11', 'alpitanand20@gmail.com','2013-04-03',10010, 10010, toTimestamp(now()));

现在当我尝试查询时,比如

SELECT * FROM banking.BankData WHERE acctID = '11' AND transactionDate >  '2012-04-03';

它说我允许过滤,但在上面提到的链接中,情况并非如此。最后的要求是按年、月、周等获取数据,这就是为什么要按天划分数据,但日期范围查询不起作用。有没有关于改造的建议,或者我做错了什么?感谢

Cassandra只支持分区键列上的相等谓词,因此只能对其使用=操作。

范围谓词(><>=<=(仅在集群列上受支持,并且它应该是条件的最后一个集群列。

例如,如果您有以下主键:(pk, c1, c2, c3),则可以有如下范围谓词:

  • where pk = xxxx and c1 > yyyy
  • where pk = xxxx and c1 = yyyy and c2 > zzzz
  • where pk = xxxx and c1 = yyyy and c2 = zzzz and c3 > wwww

但你不能有:

  • where pk = xxxx and c2 > zzzz
  • where pk = xxxx and c3 > zzzz

因为在使用范围操作之前需要限制以前的集群列。

如果您想对这些数据执行范围查询,您需要将相应的列声明为集群列,如下所示:

PRIMARY KEY(acctID, transactionDate, currentTime ) 

在这种情况下,您可以执行查询。但因为你有时间成分,你可以简单地做:

PRIMARY KEY(acctID, currentTime ) 

并进行如下查询:

SELECT * FROM banking.BankData WHERE acctID = '11' 
AND currentTime >  '2012-04-03T00:00:00Z';

但你需要考虑两件事:

  1. 你的主应该是唯一的-也许你需要添加另一个集群列,比如事务ID(例如,uuid类型(-在这种情况下,即使两个事务发生在同一毫秒内,它们也不会相互覆盖
  2. 如果每个帐户有很多事务,那么您可能需要在分区键中添加另一列。例如,年或年/月,这样就不会有大的分区

p.S.在链接答案中,由于ts是聚类列,因此可以使用不相等运算。

最新更新