通过 SAI 字段在 Cassandra (Spark) 中执行 SELECT 时以什么顺序返回行?

问题描述

如果我在 Astra 中创建了一个表格,如下所示:

CREATE TABLE rayven.mytable (
a text,b text,c timestamp,PRIMARY KEY (a,c)
) WITH CLUSTERING ORDER BY (c DESC)

然后我添加了 SAI 索引:

CREATE CUSTOM INDEX b_index ON mytable (b) USING 'StorageAttachedindex';

当我使用 ORDER BY 查询时:

select * from mytable where b='x' order by c desc;

我明白了

InvalidRequest: Error from server: code=2200 [Invalid query] message="ORDER BY with 2ndary indexes is not supported."

由于原始表是按“c”降序排列的。是否可以假设上述 SELECT 的结果将按此顺序排列,或者在使用 SAI 索引进行选择时无法知道或控制顺序?

解决方法

为了帮助说明这一点,我创建了您的表格并插入了一些数据。然后,我在表中查询了 b 的值,并在此示例的分区键上包含了 token 函数。

注意:不是在 Astra 中运行,而是在我的本地 4.0 rc1 实例上运行。但是,原则保持不变。

基本上,所有结果集都按分区键的哈希标记值排序,然后每个分区内的 CLUSTERING ORDER 优先

> SELECT a,token(a),c FROM mytable WHERE b='b';

 a  | system.token(a)      | c
----+----------------------+---------------------------------
 a4 | -9170418876698302957 | 2021-05-03 14:38:42.708000+0000
 a5 |  -925545907721365710 | 2021-05-03 14:39:06.849000+0000
 a3 |   -96725737913093993 | 2021-05-03 14:40:30.942000+0000
 a3 |   -96725737913093993 | 2021-05-03 14:39:18.340000+0000
 a2 |  5060052373555595560 | 2021-05-03 14:40:30.938000+0000
 a2 |  5060052373555595560 | 2021-05-03 14:39:14.914000+0000
 a1 |  5693669818594506317 | 2021-05-03 14:38:54.426000+0000
 a1 |  5693669818594506317 | 2021-05-03 14:38:52.758000+0000

(8 rows)

正如您在此处看到的,结果集不完全c 排序。但最初按 a 的散列标记值排序,然后c within 每个分区 (a) 排序。

所以“不”,您不能指望数据自动完全按 c 排序。