【问题标题】:How do I retrieve the last 10 inserts on a Cassandra table partitioned by timestamp?如何检索按时间戳分区的 Cassandra 表上的最后 10 次插入?
【发布时间】:2021-12-05 19:04:50
【问题描述】:

我已经看到了一些类似问题的问题,但似乎没有一个适用于我的特殊情况。

我有这张表,其中包含作为主键的时间戳和一个随机值:

CREATE TABLE IF NOT EXISTS rand_keyspace.rands (
timestamp bigint,
randnumber float,
PRIMARY KEY (timestamp));

我想检索最后插入的 10 行。

SELECT * FROM rand_keyspace.rands ORDER BY timestamp DESC LIMIT 10;

我遇到了经典错误:

InvalidRequest: Error from server: code=2200 [Invalid query] message="ORDER BY is only supported when the partition key is restricted by an EQ or an IN."

请注意,我无意按 randnumber 进行聚类或查询该列。

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    在当前状态下,该表不支持该查询。如果没有WHERE 子句,它将默认为分区键的散列令牌值的顺序。这将永远是连续的。

    根据随时间生成的随机数的数量,我建议基于时间组件创建一个新的分区键。所以像monthday 这样的东西可能会起作用。

    PRIMARY KEY (month, timestamp)
    ) WITH CLUSTERING ORDER BY (timestamp DESC);
    

    那么这个查询就可以工作了:

    SELECT * FROM rand_keyspace.rands
    WHERE month='202110'
    LIMIT 10;
    

    有了这个PRIMARY KEYCLUSTERING ORDER 定义,您就不需要ORDER BY 子句,因为默认情况下会发生这种情况(按降序排列)。

    几年前我写了一篇关于如何解决这个问题的文章:We Shall Have Order!。它可能会帮助您思考您的方法。

    【讨论】:

      【解决方案2】:

      为了补充 Aaron 的 [fantastic] 响应,不支持按分区键排序,因为它需要全表扫描。 Cassandra 专为需要快速检索单个分区的 OLTP 工作负载而设计。

      您有一个分析用例,因此您需要使用 Spark 来有效地扫描多个分区,而不是普通的 CQL。对于需要识别过去 5 分钟内的趋势内容的用例来说,这是一种常见的访问模式。干杯!

      【讨论】:

        猜你喜欢
        • 2021-12-09
        • 2019-03-27
        • 2012-05-07
        • 2017-03-06
        • 2013-07-30
        • 2023-04-05
        • 2012-03-28
        • 2018-10-06
        • 2023-03-29
        相关资源
        最近更新 更多