从 cassandra 获取最后 100 行 table

Get the last 100 rows from cassandra table

我在 cassandra 中有一个 table 现在我不能 select table 中的最后 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

我该如何克服这个问题? 谢谢

聚类顺序的顺序是单个分区键值内的顺序,例如event1 的所有行都将按 event1 的顺序排列。不是全局排序。

从您的结果我们可以看出您选择了多个分区 - 这就是为什么您没有看到预期顺序的原因。

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

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

在您的例子中,table 的主键定义为:

    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 列倒序排序。

此外,运行 无限查询(没有 WHERE 子句过滤器)在 Cassandra 中是一种反模式,因为它需要完整的 table 扫描。如果你考虑一个有 500 个节点的集群,一个无界查询必须请求所有 500 个节点的所有分区(记录)到 return 结果。它不会表现良好,也不会扩展。干杯!