对 Cassandra 查询输出数据进行排序

Sorting Cassandra Query Output Data

我相信这是 Cassandra 最常见的问题。 尽管如此:

我有这个例子table:

CREATE TABLE test.test1 (
a text,
b text,
c timestamp,
id uuid,
d timestamp,
e decimal,
PRIMARY KEY ((a),c, b, id)) WITH CLUSTERING ORDER BY (b ASC, compartment ASC);

我的查询:

select b, (toUnixTimestamp(d) - toUnixTimestamp(c))/1000/60/60/24/365.25 as age from test.test1  where a = 'x' and c > -2208981600000 ;

这工作正常,但我无法按我需要的 b 列对数据进行排序。我需要 b 列中的所有条目及其相应的“年龄”。

例如:

select b, (toUnixTimestamp(d) - toUnixTimestamp(c))/1000/60/60/24/365.25 as age from test.test1  where a = 'x' and c > -2208981600000 order by b;

报错:

InvalidRequest: Error from server: code=2200 [Invalid query] message="Order by currently only supports the ordering of columns following their declared order in the PRIMARY KEY"

我已经在聚类列中尝试了不同的顺序,在分区键中尝试了不同的选项,但我被一些逻辑所困,似乎无法战胜 Cassandra 来获得我想要的东西。如果我得到我想要的排序顺序,我将失去对列 'c'.

进行过滤的能力

是否有一些逻辑我没有在这里应用,或者,我必须省略什么(?)才能获得 b 列中具有相应年龄的条目列表。

简答 - 使用 CQL 无法对任意列的数据进行排序,即使它是主键的一部分。 Cassandra 首先按第一个聚类列对数据进行排序,然后按第二个在其中排序,依此类推(请参阅此 )。

所以现在唯一的解决方法是在客户端获取所有数据并排序。