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

时间:2016-08-19 12:58:03

标签: c# cassandra

为什么我不能通过主键订购?

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

    PRIMARY KEY ("SeqNum")    
)

select * "My_Data"
order by "SeqNum"

错误:

  

仅当分区键受EQ或IN

限制时才支持ORDER BY

1 个答案:

答案 0 :(得分:4)

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

去年我写了article describing this functionality for Planet Cassandra。按照本文中的第二个示例,考虑此表定义:

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

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

> 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

这里需要注意的一些事项:

  1. userid是分区键,行的值依次为

  2. 这些值实际上由分区键的散列标记值“排序”,正如您可以将token函数应用于userid列。

  3. 该表将posttime定义为其聚类键,但结果集也未按该列排序。但是,在每个userid中,结果按<{1}}排序。这应该告诉您不能在未绑定的查询(不带posttime子句的查询)中对Cassandra中的查询结果进行排序。

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

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

    ORDER BY

    如您所见,按分区键进行查询过滤的结果确实是按照表定义中定义的降序排列。此外,从多个分区返回数据的查询不具有性能,并被视为反模式。