排序Cassandra查询输出数据



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

我有这个示例表:

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首先按第一个集群列对数据进行排序,然后按第二个集群列在数据内部进行排序,依此类推(见答案(。

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

最新更新