【问题标题】:InvalidRequest: code=2200 [Invalid query] message="Invalid operator >= for PRIMARY KEY part "InvalidRequest: code=2200 [Invalid query] message="Invalid operator >= for PRIMARY KEY part "
【发布时间】:2023-03-15 18:10:01
【问题描述】:

我在 cassandra 中有以下数据集:

表结构

CREATE TABLE userlog (
 term text,
 ts timestamp,
 year int,
 month int,
 day int,
 hour int,
 weekofyear int,
 dayofyear int,
 count counter,
 PRIMARY KEY (term, ts, year,month,day,hour,weekofyear,dayofyear)
);

.

term             | ts                       | year | month | day | hour | weekofyear | dayofyear | count
------------------+--------------------------+------+-------+-----+------+------------+-----------+-------
www.datastax.com | 2028-07-13 17:06:28+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
www.datastax.com | 2015-07-28 16:17:36+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     6
www.datastax.com | 2015-07-28 16:17:36+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
www.datastax.com | 2015-07-28 16:17:36+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
www.datastax.com | 2015-07-28 16:21:15+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
www.datastax.com | 2015-07-28 16:21:33+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
www.datastax.com | 2015-07-28 16:21:50+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
www.datastax.com | 2015-07-28 16:21:52+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
www.datastax.com | 2015-07-28 16:21:53+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
             www | 2015-07-28 16:46:00+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
            www. | 2015-07-28 16:47:00+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
            www. | 2015-07-28 16:48:00+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
            www. | 2015-07-28 16:50:00+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
            www. | 2015-07-28 16:55:00+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2

当我运行这个查询时:

SELECT * FROM userlog  WHERE ts >= '2015-07-28 16:46' AND  ts <= '2015-07-28 16:55' ALLOW FILTERING;

我得到正确的结果:

term | ts                       | year | month | day | hour | weekofyear | dayofyear | count
------+--------------------------+------+-------+-----+------+------------+-----------+-------
www  | 2015-07-28 16:46:00+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
www. | 2015-07-28 16:47:00+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
www. | 2015-07-28 16:48:00+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
www. | 2015-07-28 16:50:00+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2
www. | 2015-07-28 16:55:00+0530 | 2015 |     7 |  28 |   16 |         31 |       209 |     2

但是当我尝试删除具有相同条件的行时

DELETE FROM userlog WHERE ts >= '2015-07-28 16:46' AND  ts <= '2015-07-28 16:55';

它会抛出以下错误:

InvalidRequest: code=2200 [Invalid query] message="Invalid operator >= for PRIMARY KEY part ts"

我错过了什么吗?如何删除指定时间范围内的数据?另外,有什么方法可以获取指定时间范围内的数据(除了我在做什么?)

【问题讨论】:

    标签: cassandra cql cqlsh


    【解决方案1】:

    DELETE 命令不支持范围查询或 ALLOW FILTERING 子句。从文档来看,它只支持 = 和 IN 运算符:

    您可以通过完全指定分区和集群列来删除单个行。

    您只需指定分区键即可删除整个分区。

    您可以使用 IN 运算符一次执行其中的一些操作。

    如果您想有选择地从分区中删除行,您可以首先使用 SELECT 查询它们,然后在您的应用程序中为从 SELECT 返回的每一行发出删除。

    通常你不想在你的 SELECT 语句上使用 ALLOW FILTERING,因为这非常低效,所以通常你会在执行范围查询 SELECT 时指定分区键。您将构建您的架构,以便操作所需的信息位于已知分区中,这样您就不需要进行全表扫描来查找内容。

    【讨论】:

    • If you want to selectively delete rows from within a partition, you could first query for them using SELECT and then in your application issue a delete for each row returned from the SELECT.这是怎么做到的?如何将select结果传递给delete语句?
    • 我可以迭代并得到结果ResultSet result = session.execute(insertUpdateTable); while(result.iterator().hasNext()) { System.out.println(result.one()); }如何将它传递给delete语句?
    • 吉姆的回答很好!围绕 CQL DELETE 有很多混淆,所以很高兴看到它像这样拼写出来。
    • @user-4870385 在遍历结果行时,您将使用 QueryBuilder 通过读取每个结果行的列值来构建适当的删除语句。然后您将异步发出删除语句,以便将它们通过管道快速运行。
    猜你喜欢
    • 2017-10-18
    • 2023-03-16
    • 2015-01-30
    • 2023-03-08
    • 1970-01-01
    • 2021-09-03
    • 2021-10-04
    • 1970-01-01
    • 2021-02-28
    相关资源
    最近更新 更多