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
真正能做的就是改变排序方向(降序与升序)。
我想对给定的列族进行排序,为此我正在尝试创建一个 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
真正能做的就是改变排序方向(降序与升序)。