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)
您需要了解几件事,在这种情况下,分区键为“ 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了解更多信息
错误消息非常清楚:您不能不ORDER BY使用子句限制查询WHERE。这是设计使然。
在不带子句的情况下运行时获得的数据WHERE实际上是排序的,不是使用集群键,而是通过将令牌函数应用于分区键。您可以通过发出以下命令来验证订单:
SELECT token(id), id, created_at, user_id FROM posts;
Run Code Online (Sandbox Code Playgroud)
其中token函数参数与您的 PARTITION KEY 完全匹配。
| 归档时间: |
|
| 查看次数: |
3474 次 |
| 最近记录: |