cassandra在查询中提到所有分区键后仍要求允许筛选?

lrl1mhuk  于 2021-06-09  发布在  Cassandra
关注(0)|答案(1)|浏览(392)

我一直试图在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';

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

uqzxnwby

uqzxnwby1#

cassandra只支持分区键列上的相等 predicate ,因此只能使用 = 对它的操作。
范围 predicate ( > , < , >= , <= )仅在群集列上支持,并且它应该是条件的最后一个群集列。
例如,如果您有以下主键: (pk, c1, c2, c3) ,可以有如下范围 predicate : where pk = x and c1 > yyyy where pk = xxxx and c1 = yyyy and c2 > zzzz where pk = x and c1 = yyyy and c2 = zzzz and c3 > wwww 但你不能有:
where pk = xxxx and c2 > zzzz where pk = x 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 类型)-在这种情况下,即使两个事务发生在同一毫秒内,它们也不会相互覆盖;
如果每个帐户有很多事务,那么可能需要在分区键中添加另一列。例如,year或year/month,因此您没有大的分区。
p、 在链接答案中使用非相等运算是可能的,因为 ts 是群集列。

相关问题