1

我一直在尝试在 Cassandra 中对数据进行建模,并试图根据日期过滤数据,正如这里关于 SO 的答案所给出的那样,这里的第二个答案是不使用 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';

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

4

1 回答 1

2

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. 如果每个帐户有很多交易,那么您可能需要在分区键中添加另一列。例如,年或年/月,因此您没有大分区。

PS 在链接答案中使用非等式运算是可能的,因为ts它是聚类列。

于 2020-04-07T08:26:12.647 回答