Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra 卡桑德拉,重新上膛_Cassandra_Cassandra Cli - Fatal编程技术网

Cassandra 卡桑德拉,重新上膛

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);

我想对给定的列族进行排序,为此我尝试创建一个带有选项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, 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,修改后的架构将返回基于姓氏的排序结果。