我在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的顺序排列。这不是一个全局排序。
从你的结果中我们可以看到你选择了多个分区,这就是为什么你没有看到你期望的顺序。