按创建日期排序在Cassandra

时间:2016-11-09 20:01:33

标签: cassandra bigdata database

我在 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 个答案:

答案 0 :(得分:4)

您需要了解几件事情, 在您的情况下,分区键是“id”,聚类键是“created_at”。

本质上意味着任何行都将基于“id”的哈希存储在分区中(默认情况下,它取决于您的哈希方案是Murmur3),现在在该分区内,数据根据您的群集键进行排序,在您的情况下“created_at”。

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

如果你没有在WHERE子句中指定分区键,那么结果集的实际顺序则依赖于分区键的散列值(在你的case id中)

所以为了按特定订单获取帖子。你必须像这样指定分区键

  

从帖子中选择* WHERE id = 1 order by created_at desc;

注意:

  

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

所以基本上上面的查询与

相同
  

从帖子WHERE id = 1

中选择*

您可以在http://www.datastax.com/dev/blog/we-shall-have-order

了解更多相关信息

答案 1 :(得分:3)

错误消息非常明确:如果不使用ORDER BY子句限制查询,则不能WHERE。这是设计的。

在没有WHERE子句的情况下运行时获得的数据实际 ,而不是使用群集密钥,而是将token function应用于分区键。您可以通过发出以下命令来验证订单:

SELECT token(id), id, created_at, user_id FROM posts;

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

我建议您阅读thisthis,了解您能做什么/不能做什么。