ORDER BY 重新加载,卡桑德拉

ORDER BY reloaded, cassandra

我想对给定的列族进行排序,为此我正在尝试创建一个 table 并带有选项 CLUSTERING ORDER BY。我总是遇到以下错误:

1.) 变体 A 导致 错误请求:缺少 userid 列的 CLUSTERING ORDER 声明:

CREATE TABLE test.user (
  userID timeuuid,
  firstname varchar,
  lastname varchar,
  PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc);

2.) 变体 B 导致 错误请求:只能在 CLUSTERING ORDER 指令中定义集群键列 声明:

CREATE TABLE test.user (
  userID timeuuid,
  firstname varchar,
  lastname varchar,
  PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc, userID asc);

据我在手册中所见,这是创建 table 的正确语法,我希望 运行 查询为 "SELECT .... FROM user WHERE ... ORDER BY lastname"。 我怎样才能做到这一点?(列 'lastname' 我想保留为主键的第一部分,这样我就可以在带有 WHERE 的删除语句中使用它-子句。)

非常感谢,塔玛斯

集群将限于分区键中定义的内容,在您的情况下 (lastName + userId)。因此,cassandra 将按其 (lastName+userId) 组合的排序顺序存储结果。这就是为什么出于检索目的而需要同时提供两者的原因。如果您想将 table 中的所有数据排序为姓氏,因为 userId 是唯一的(timeuuid),它仍然没有用的架构,因此聚类键没有用。

CREATE TABLE test.user (
  userID timeuuid,
  firstname varchar,
  lastname varchar,
  bucket int,
  PRIMARY KEY (bucket)
)WITH CLUSTERING ORDER BY (lastname desc);

在这里,如果您为所有用户记录提供存储桶值(比如 1),那么所有用户都将进入同一个存储桶,然后它将按姓氏的排序顺序检索所有行。 (这绝不是一个好的设计,只是给你一个想法)。

修订:

CREATE TABLE user1 (
  userID uuid,
  firstname varchar,
  lastname varchar,
  bucket int,
  PRIMARY KEY ((bucket), lastname,userID)
)WITH CLUSTERING ORDER BY (lastname desc);

您只能在集群键上指定集群顺序。

PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc);

在您的第一个示例中,您唯一的聚类键是 userID。因此,它是 CLUSTERING ORDER BY.

的唯一有效条目
PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc, userID asc);

第二个示例失败,因为您在 CLUSTERING ORDER BY 中指定了分区键,这也不起作用。

Cassandra 的工作方式是根据集群键对 CQL 行进行排序,但前提是指定了分区键。这是因为Cassandra宽行建模的整个思想就是通过partition key进行查询,在一个查询操作中读取一系列有序的行。

I would like to run queries as "SELECT .... FROM user WHERE ... ORDER BY lastname".

鉴于此声明,我建议您在此模型中需要另一列,然后它才能按您希望的方式工作。您需要的是适合您的 users table 的 partition key。说...喜欢 group。如果您的用户按 group 分区并按 lastname 聚类,您的定义将如下所示:

CREATE TABLE test.usersbygroup (
  userID timeuuid,
  firstname varchar,
  lastname varchar,
  group text,
  PRIMARY KEY (group,lastname)
)WITH CLUSTERING ORDER BY (lastname desc);

然后,此查询将起作用,返回按 lastname(降序)排序的节目 "Firefly," 粉丝的用户(在本例中):

SELECT * FROM usersbygroup WHERE group='Firefly Fans';

通读 Compound Keys and Clustering 上的这个 DataStax 文档以获得更好的理解。

注意:您不需要在 SELECT 中指定 ORDER BY。这些行将按其聚类键排序返回,ORDER BY 无法更改。 ORDER BY 真正能做的就是改变排序方向(降序与升序)。