按创建日期排序在Cassandra

Ham*_*deh 7 database bigdata cassandra

我在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)
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时,我收到以下消息:

查询:

 select * from posts order by created_at desc;
Run Code Online (Sandbox Code Playgroud)

消息:

ORDER BY is only supported when the partition key is restricted by an EQ or an IN.
Run Code Online (Sandbox Code Playgroud)

或者此查询返回数据而不进行排序:

select * from posts
Run Code Online (Sandbox Code Playgroud)

man*_*nuj 5

您需要了解几件事,在这种情况下,分区键为“ id”,群集键为“ created_at”。

从本质上讲,这意味着将根据“ id”的哈希将任何行存储在分区中(根据您的哈希方案,默认情况下为Murmur3),现在在该分区中,数据将根据您的聚类键进行排序情况“ created_at”。

因此,如果默认情况下查询该表中的某些数据,则根据聚类顺序对结果进行排序,并且默认排序顺序是您在创建表时指定的排序顺序。但是那里有一个陷阱。

如果您未在WHERE子句中指定分区键,则结果集的实际顺序将取决于分区键的哈希值(在您的情况下为id)

因此,为了按照该特定顺序获取帖子。您必须像这样指定分区键

从created_at desc排序为id = 1的帖子中选择*;

注意:

如果所需的排序方向(“ ASCending / DESCending”)已经与表定义中的CLUSTERING ORDER相匹配,则无需在查询中指定ORDER BY子句。

因此,基本上上述查询与

从ID为1的帖子中选择*

您可以在这里http://www.datastax.com/dev/blog/we-shall-have-order了解更多信息


xma*_*s79 3

错误消息非常清楚:您不能不ORDER BY使用子句限制查询WHERE。这是设计使然。

在不带子句的情况下运行时获得的数据WHERE实际上排序的,不是使用集群键,而是通过将令牌函数应用于分区键。您可以通过发出以下命令来验证订单:

SELECT token(id), id, created_at, user_id FROM posts;
Run Code Online (Sandbox Code Playgroud)

其中token函数参数与您的 PARTITION KEY 完全匹配

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

  • 你的意思是这个查询应该返回默认排序的数据? (2认同)
  • 我尝试了这个查询,但不幸的是相同的输出(未排序的数据) (2认同)
  • 我的意思正是我所写的:此查询*已经返回*由 token(id) 函数排序的数据。 (2认同)
  • @HametGholizadeh 除非您还在“WHERE”子句中提供分区键,否则您不能。 (2认同)