为什么我不能通过主键订购?
CREATE TABLE "My_Data" (
"SeqNum" bigint,
"ShoeSize" double ,
PRIMARY KEY ("SeqNum")
)
select * "My_Data"
order by "SeqNum"
错误:
仅当分区键受EQ或IN
限制时才支持ORDER BY
答案 0 :(得分:4)
因为Cassandra仅支持 群集密钥的结果集排序,而 分区键中的。在您的情况下,"SeqNum"
是您的分区键,并且您没有定义群集键。
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
这里需要注意的一些事项:
userid
是分区键,行的值依次为不。
这些值实际上由分区键的散列标记值“排序”,正如您可以将token
函数应用于userid
列。
该表将posttime
定义为其聚类键,但结果集也未按该列排序。但是,在每个userid
中,结果按<{1}}排序。这应该告诉您不能在未绑定的查询(不带posttime
子句的查询)中对Cassandra中的查询结果进行排序。
要在结果集中强制执行排序顺序,您甚至不需要使用WHERE
子句。
如果我想要按发布时间排序的帖子,我需要提供(在这种情况下)特定用户的ID:
ORDER BY
如您所见,按分区键进行查询过滤的结果确实是按照表定义中定义的降序排列。此外,从多个分区返回数据的查询不具有性能,并被视为反模式。