Cassandra 要求即使在查询中提及所有分区键后也允许过滤?

Cassandra asking to allow filter even after mentioning all partition key in query?

我一直在尝试在 Cassandra 中对数据建模,并尝试根据其中的日期过滤数据,正如 SO 上的答案所给出的那样,Here second answer is not using 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';

说的是允许过滤,但是在上面提到的link中,并不是这样的。 最终要求是按年、月、周等获取数据,这就是为什么要按天对其进行分区的原因,但是日期范围查询不起作用。 任何改造建议或我做错了什么? 谢谢

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 个交易发生在同一毫秒内, 他们不会互相覆盖;
  2. 如果您每个帐户有很多交易,那么您可能需要在分区键中添加另一列。例如,年份或 year/month,因此您没有大分区。

P.S。在链接的答案中使用非相等操作是可能的,因为 ts 是聚类列。