cassandra - 如何检索按时间戳分区的 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 进行聚类或查询该列。
解决方案
在当前状态下,该表无法支持该查询。如果没有WHERE
子句,它将默认为分区键的哈希令牌值的顺序。那永远不会是连续的。
根据随时间生成的随机数的数量,我建议基于时间组件创建一个新的分区键。所以类似month
或day
可能有效的东西。
PRIMARY KEY (month, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC);
那么这个查询就可以工作了:
SELECT * FROM rand_keyspace.rands
WHERE month='202110'
LIMIT 10;
有了这个PRIMARY KEY
和CLUSTERING ORDER
定义,您就不需要该ORDER BY
子句,因为默认情况下会发生这种情况(按降序排列)。
几年前我写了一篇关于如何解决这个问题的文章:我们将有秩序!. 它可能会帮助您思考您的方法。
推荐阅读
- chart.js - ChartJS:删除条形图上第一个和最后一个条的填充
- javascript - JS typeOf(array) = 'object'
- android - 打开项目时出错
- arrays - 如何将 Go validator.FieldLevel.Field() 转换为字符串数组
- php - 速记三元运算符 PHP - 在 null 上调用成员函数
- python - 如何仅使用不同长度的字符串按最后 x 个字符排序?
- typescript - 打字稿调用匿名函数给出_this不是函数
- python - 从未托管在谷歌云平台上的本地项目访问谷歌云 API
- database - 在适用于列表和网格的数据库中存储位置信息的最有效方法是什么?
- python - selenium-webdriver 单击链接时弹出文件下载会打开一个转换为下载框的新窗口?