我一直在尝试在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';
但你需要考虑两件事:
- 你的主应该是唯一的-也许你需要添加另一个集群列,比如事务ID(例如,
uuid
类型(-在这种情况下,即使两个事务发生在同一毫秒内,它们也不会相互覆盖 - 如果每个帐户有很多事务,那么您可能需要在分区键中添加另一列。例如,年或年/月,这样就不会有大的分区
p.S.在链接答案中,由于ts
是聚类列,因此可以使用不相等运算。