我一直试图在cassandra中建立一个数据模型,并试图根据数据过滤数据,正如这里的答案所给出的,所以这里的第二个答案是不使用allow filter。
这是我目前的模式,
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';
它说我允许过滤,但是在上面提到的链接中,情况并非如此。最终的要求是按年、月、周等来获取数据,这就是为什么要按天对数据进行分区,但日期范围查询不起作用。有没有改造的建议或者我做错了什么?谢谢
1条答案
按热度按时间uqzxnwby1#
cassandra只支持分区键列上的相等 predicate ,因此只能使用
=
对它的操作。范围 predicate (
>
,<
,>=
,<=
)仅在群集列上支持,并且它应该是条件的最后一个群集列。例如,如果您有以下主键:
(pk, c1, c2, c3)
,可以有如下范围 predicate :where pk = x and c1 > yyyy
where pk = xxxx and c1 = yyyy and c2 > zzzzwhere pk = x and c1 = yyyy and c2 = zzzz and c3 > wwww
但你不能有:where pk = xxxx and c2 > zzzz
where pk = x and c3 > zzzz
因为在使用范围操作之前需要限制以前的群集列。如果要对此数据执行范围查询,则需要将相应的列声明为集群列,如下所示:
在这种情况下,您可以执行查询。但因为你有时间成分,你可以简单地做:
然后像这样进行查询:
但你需要考虑两件事:
您的主对象应该是唯一的-可能需要添加另一个集群列,比如事务id(例如
uuid
类型)-在这种情况下,即使两个事务发生在同一毫秒内,它们也不会相互覆盖;如果每个帐户有很多事务,那么可能需要在分区键中添加另一列。例如,year或year/month,因此您没有大的分区。
p、 在链接答案中使用非相等运算是可能的,因为
ts
是群集列。