为什么我不能按 CQL 中的主键排序?

Man*_*oon 3 c# cassandra

为什么我不能按主键排序?

CREATE TABLE "My_Data" (    
    "SeqNum" bigint,
    "ShoeSize" double ,   

    PRIMARY KEY ("SeqNum")    
)

select * "My_Data"
order by "SeqNum"
Run Code Online (Sandbox Code Playgroud)

错误:

ORDER BY 仅在分区键受 EQ 或 IN 限制时支持

Aar*_*ron 6

因为 Cassandra 仅支持集群键和分区键内的结果集排序。在您的情况下,"SeqNum"是您的分区键,并且您没有定义集群键。

我去年写了一篇文章来描述这个功能。按照我在文章中的第二个例子,考虑这个表定义:

CREATE TABLE postsbyuser (
  userid bigint,
  posttime timestamp,
  postid uuid,
  postcontent text,
  PRIMARY KEY ((userid), posttime)
) WITH CLUSTERING ORDER BY (posttime DESC);
Run Code Online (Sandbox Code Playgroud)

如果我要插入六行然后查询表:

> SELECT userid, token(userid), posttime FROM postsbyuser;
 
 userid | token(userid)        | posttime 
--------+----------------------+-------------------------- 
      1 | -4069959284402364209 | 2015-01-25 13:25:00-0600 
      1 | -4069959284402364209 | 2015-01-25 13:22:00-0600 
      0 | -3485513579396041028 | 2015-01-25 13:21:00-0600 
      2 | -3248873570005575792 | 2015-01-25 13:28:00-0600 
      2 | -3248873570005575792 | 2015-01-25 13:27:00-0600 
      2 | -3248873570005575792 | 2015-01-25 13:26:00-0600
Run Code Online (Sandbox Code Playgroud)

这里有几点需要注意:

  1. userid是分区键,行的值绝对不是按顺序排列的。

  2. 这些值实际上是按分区键的散列标记值“排序”的,正如您在将token函数应用于userid列中所看到的那样。

  3. 该表定义posttime为其聚类键,但结果集也不按该列排序。然而,在每个userid,结果被订购posttime。这应该告诉您,您无法在 Cassandra 中对未绑定查询(没有WHERE子句的查询)的查询结果进行排序。

  4. 要在结果集中强制执行排序顺序,您甚至不需要使用ORDER BY子句。

如果我想要按发布时间排序的帖子,我将需要提供(在这种情况下)特定用户的 ID:

> SELECT userid, token(userid), posttime
FROM postsbyuser
WHERE userid=2;

 userid | token(userid)        | posttime 
--------+----------------------+-------------------------- 
      2 | -3248873570005575792 | 2015-01-25 13:28:00-0600 
      2 | -3248873570005575792 | 2015-01-25 13:27:00-0600 
      2 | -3248873570005575792 | 2015-01-25 13:26:00-0600
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,用于查询由分区键过滤的结果的确存在一个在表定义中定义的降序排列。此外,从多个分区返回数据的查询性能不佳,被认为是一种反模式。