首页 > 解决方案 > 如何检索按时间戳分区的 Cassandra 表上的最后 10 个插入?

问题描述

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

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

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 进行聚类或查询该列。

标签: cassandracql

解决方案


在当前状态下,该表无法支持该查询。如果没有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子句,因为默认情况下会发生这种情况(按降序排列)。

几年前我写了一篇关于如何解决这个问题的文章:我们将有秩序!. 它可能会帮助您思考您的方法。


推荐阅读