【问题标题】:Cassandra asking to allow filter even after mentioning all partition key in query?即使在查询中提及所有分区键后,Cassandra 仍要求允许过滤?
【发布时间】:2020-07-19 09:05:19
【问题描述】:

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

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

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    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 个事务发生在同一毫秒内,它们也不会t 互相覆盖;
    2. 如果每个帐户有很多事务,则可能需要在分区键中添加另一列。例如,年或年/月,因此您没有大分区。

    附:由于ts 是聚类列,因此可以在链接答案中使用不等式运算。

    【讨论】:

    • 谢谢@Alex,但是我们如何才能对日期进行范围查询,任何提示,就像我想要同一帐户ID的某个持续时间之间的数据?如何处理?
    • 感谢这确实很有帮助
    • 这就是我根据你的第二点尝试做的事情,但是由于分区键无法进行范围查询,这就是为什么这样的问题
    • 所以如果用户想查询数据,想知道余额,他必须知道最近的交易月份,否则不可能对吗?
    • 是的,如果您处理第二个项目,您需要知道月份进行查询...但是如果您将其编写为 API 的代码 - 它不应该是问题 - 只需添加相应的列
    猜你喜欢
    • 1970-01-01
    • 2020-12-01
    • 2018-09-18
    • 2021-09-10
    • 1970-01-01
    • 2020-12-22
    • 2017-07-23
    • 2015-02-01
    相关资源
    最近更新 更多