【问题标题】:Sorting Cassandra Query Output Data对 Cassandra 查询输出数据进行排序
【发布时间】:2020-11-06 19:30:09
【问题描述】:

我确信这是 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 列中具有相应年龄的条目列表。

【问题讨论】:

    标签: sorting cassandra output primary-key


    【解决方案1】:

    简短的回答 - 使用 CQL 对任意列上的数据进行排序是不可能的,即使它是主键的一部分。 Cassandra 首先按第一个聚类列对数据进行排序,然后按第二个在其中排序,依此类推(参见answer)。

    因此,目前唯一的解决方法是获取所有数据并在客户端进行排序。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多