从cassandra表中获取最近100行



我在cassandra中有一个表,现在我不能选择表中的最后200行。聚类order by子句应该在磁盘上强制排序。

CREATE TABLE t1(id int , 
event text, 
receivetime timestamp ,
PRIMARY KEY (event, id)
) WITH CLUSTERING ORDER BY (id DESC)
;

输出未按id排序:

event   | id | receivetime
---------+----+---------------------------------
event1 |  1 | 2021-07-12 08:11:57.702000+0000
event7 |  7 | 2021-05-22 05:30:00.000000+0000
event5 |  5 | 2021-05-25 05:30:00.000000+0000
event9 |  9 | 2021-05-22 05:30:00.000000+0000
event2 |  2 | 2021-05-21 05:30:00.000000+0000
event10 | 10 | 2021-05-23 05:30:00.000000+0000
event4 |  4 | 2021-05-24 05:30:00.000000+0000
event6 |  6 | 2021-05-27 05:30:00.000000+0000
event3 |  3 | 2021-05-22 05:30:00.000000+0000
event8 |  8 | 2021-05-21 05:30:00.000000+0000

我如何克服这个问题?由于

同样的问题在https://community.datastax.com/questions/11983/上被问到,所以我在这里重新发布我的答案。

分区内的行是根据集群列的顺序排序的,而不是分区键。

在您的示例中,表的主键定义为:

PRIMARY KEY (event, id)

这意味着每个分区键可以有一个或多个行,每一行由id列标识。由于每个分区中只有一行,所以排序顺序并不明显。但是如果在每个分区中有多行,就可以看到它们是排序的。例如:

event   | id | receivetime
---------+----+---------------------------------
event1 |  7 | 2021-05-22 05:30:00.000000+0000
event1 |  5 | 2021-05-25 05:30:00.000000+0000
event1 |  1 | 2021-07-12 08:11:57.702000+0000

在上面的示例中,分区event1有3行,按ID列倒序排序。

此外,在Cassandra中运行无界查询(没有WHERE子句过滤器)是一种反模式,因为它需要全表扫描。如果您考虑一个有500个节点的集群,那么无界查询必须请求来自所有500个节点的所有分区(记录)才能返回结果。它不能很好地执行,也不能扩展。干杯!

集群顺序的顺序是在单个分区键值内的顺序,例如event1的所有行都将按照event1的顺序排列。这不是一个全局排序。

从你的结果中我们可以看到你选择了多个分区,这就是为什么你没有看到你期望的顺序。

相关内容

  • 没有找到相关文章

最新更新