Cassandra 卡桑德拉,重新上膛
我想对给定的列族进行排序,为此我尝试创建一个带有选项CLUSTERING ORDER BY的表。我经常遇到以下错误: 1.)导致 请求错误:缺少列userid的群集顺序 声明:Cassandra 卡桑德拉,重新上膛,cassandra,cassandra-cli,Cassandra,Cassandra Cli,我想对给定的列族进行排序,为此我尝试创建一个带有选项CLUSTERING ORDER BY的表。我经常遇到以下错误: 1.)导致 请求错误:缺少列userid的群集顺序 声明: CREATE TABLE test.user ( userID timeuuid, firstname varchar, lastname varchar, PRIMARY KEY (lastname, userID) )WITH CLUSTERING ORDER BY (lastname desc);
CREATE TABLE test.user (
userID timeuuid,
firstname varchar,
lastname varchar,
PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc);
CREATE TABLE test.user (
userID timeuuid,
firstname varchar,
lastname varchar,
PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc, userID asc);
2.)变体B导致
错误请求:只能在群集顺序指令中定义群集键列
声明:
CREATE TABLE test.user (
userID timeuuid,
firstname varchar,
lastname varchar,
PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc);
CREATE TABLE test.user (
userID timeuuid,
firstname varchar,
lastname varchar,
PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc, userID asc);
据我在手册中看到的,这是创建一个表的正确语法,我希望为该表运行“SELECT….FROM user WHERE….ORDER BY lastname”查询如何实现这一点?(我希望保留列“lastname”作为主键的第一部分,以便在带有WHERE子句的delete语句中使用。)
非常感谢,在您的情况下,Tamas集群将仅限于分区键中定义的内容(lastName+userId)。所以cassandra将按排序顺序存储结果,其组合为(lastName+userId)。这就是为什么你想把这两个都拿来检索的原因。若您想对表中的所有数据进行排序,因为用户名是唯一的(timeuuid),所以集群键并没有用处,那个么它仍然并没有用处
CREATE TABLE test.user (
userID timeuuid,
firstname varchar,
lastname varchar,
bucket int,
PRIMARY KEY (bucket)
)WITH CLUSTERING ORDER BY (lastname desc);
这里,若你们为所有用户记录提供buket值,比如说1,那个么所有用户都将进入同一个bucket,并且它将按照姓氏的排序顺序检索所有行。(这绝不是一个好的设计,只是给你一个想法)
修订:
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
。因此,它是聚类顺序的唯一有效条目
PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc, userID asc);
第二个示例失败,因为您正在按的聚类顺序指定分区键,而这也不起作用
Cassandra的工作原理是根据集群键对CQL行进行排序,但仅当指定了分区键时。这是因为Cassandra宽行建模的整体思想是通过分区键进行查询,并在一个查询操作中读取一系列有序行
我想以“选择……从用户那里……按姓氏排序”的方式运行查询
考虑到这一点,我建议您在这个模型中需要另一个专栏,然后它才能按您想要的方式工作。您需要的是适合用户的表。说…像组
。如果您的用户按组划分
,并按lastname
聚集,则您的定义如下所示:
CREATE TABLE test.usersbygroup (
userID timeuuid,
firstname varchar,
lastname varchar,
group text,
PRIMARY KEY (group,lastname)
)WITH CLUSTERING ORDER BY (lastname desc);
然后,该查询将起作用,返回由lastname
(降序)排序的“萤火虫”节目粉丝的用户(在本例中):
通读本税务文件,以便更好地理解
注意:您不需要在选择中指定订单依据
。行将按其群集键排序返回,并且orderby
无法更改该顺序。“排序依据”
真正能做的就是改变排序方向(降序与升序)。您关于聚类顺序的陈述是不正确的。分区键与磁盘上的排序顺序无关。聚类键影响排序顺序。分区键的散列值决定集群中的位置。另外,您的CREATE TABLE
语句将失败,并出现“主键中引用的未知定义伪值”。@BryceAtNetwork23我希望将bucket作为主键,现已更正。例如,如果我们将pk作为userID(这对于每个新用户都是不同的),那么集群键将只在同一个分区中的行上工作,因为由于timeuuid,分区中只有一条记录,排序将在单个记录上进行,而不是在表中进行。现在,它将失败“只能在clustering ORDER指令中定义群集键列。”只要al user的bucket值为1,修改后的架构将返回基于姓氏的排序结果。