按创建日期排序在Cassandra中的应用

9
我在Cassandra数据库中排序数据遇到了问题。这是我的表结构:
CREATE TABLE posts (
    id uuid,
    created_at timestamp,
    comment_enabled boolean,
    content text,
    enabled boolean,
    meta map<text, text>,
    post_type tinyint,
    summary text,
    title text,
    updated_at timestamp,
    url text,
    user_id uuid,
    PRIMARY KEY (id, created_at)
) WITH CLUSTERING ORDER BY (created_at DESC)

当我运行这个查询时,我得到以下信息: 查询:
 select * from posts order by created_at desc;

消息:

ORDER BY is only supported when the partition key is restricted by an EQ or an IN.

这个查询可以不排序返回数据:
select * from posts
2个回答

5
有几件事情您需要了解,对于您的情况,分区键是"id",聚集键是"created_at"。
这实际上意味着任何行都将基于"id"的哈希值(默认情况下为Murmur3)存储在一个分区中,现在在该分区内,数据根据您的聚集键排序,对于您的情况是"created_at"。
因此,如果您从表中查询一些数据,默认情况下结果将根据聚集顺序排序,而默认排序顺序是在创建表时指定的。但是有一个要注意的地方。 如果您在WHERE子句中未指定分区键,则结果集的实际顺序取决于分区键的哈希值(在您的情况下为id)。 因此,为了按特定顺序获取帖子,您必须像这样指定分区键:

select * from posts WHERE id=1 order by created_at desc;

注意:

如果所需的排序方向(“升序/降序”)已经与表定义中的聚集顺序匹配,则不必在查询中指定ORDER BY子句。

因此,以上查询与以下查询相同:

select * from posts WHERE id=1

您可以在此处阅读更多信息:http://www.datastax.com/dev/blog/we-shall-have-order

非常好的解释。此外,+1 链接我的文章! - Aaron
1
tnQ,它真的帮了我♥ - Hamet Gholizadeh

3
错误信息非常清晰:您无法使用ORDER BY而不使用WHERE子句限制查询。这是有意设计的。
当没有WHERE子句运行时,您获得的数据实际上已经被排序了,但不是按照您的聚簇键,而是通过将token函数应用于分区键进行排序。您可以通过发出以下命令来验证顺序:
SELECT token(id), id, created_at, user_id FROM posts;

当且仅当token函数的参数完全匹配您的分区键时,才能使用它。

我建议您阅读这篇文章这篇文章,以了解您可以/不能做什么。


2
这个查询应该按默认顺序返回数据吗? - Hamet Gholizadeh
2
我尝试了这个查询,但不幸的是输出结果相同(未排序的数据)。 - Hamet Gholizadeh
2
我的意思就是我所写的:这个查询已经按照token(id)函数排序返回了数据。 - xmas79
2
@HametGholizadeh,除非您在WHERE子句中提供分区键,否则无法执行此操作。 - Aaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接