ORDER BY重新加载,cassandra

时间:2015-02-26 22:04:57

标签: cassandra cassandra-cli

我想要排序的给定列族我想尝试创建一个带有CLUSTERING ORDER BY选项的表。我总是遇到以下错误:

1。)变体A导致 错误请求:列用户标识缺少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);

就我在手册中看到的而言,这是创建一个表格的正确语法,我希望运行查询作为" SELECT .... FROM user WHERE ... ORDER BY lastname&#34 ;。 我怎么能实现这个目标?(列'姓氏'我想保留作为主键的第一部分,以便我可以在WHERE的删除语句中使用它-clause。)

非常感谢,Tamas

2 个答案:

答案 0 :(得分:2)

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

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宽行建模的整个想法是通过分区键进行查询,并在一次查询操作中读取一系列有序行。

  

我想将查询作为“SELECT .... FROM user WHERE ... ORDER BY lastname”运行。

鉴于此声明,我建议您在此模型中需要另一列,然后才能按照您希望的方式工作。您需要的是users表的适当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);

然后,这个查询将起作用,返回用户(在这种情况下),他们是节目“Firefly”的粉丝,按lastname排序(降序):

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

Compound Keys and Clustering上阅读此DataStax文档,以便更好地理解。

注意:您无需在ORDER BY中指定SELECT。行将按其聚类键的顺序返回,ORDER BY无法更改。所有ORDER BY都可以做,是改变排序方向(DESCending vs. ASCending)。

答案 1 :(得分:1)

在您的情况下(lastName + userId),群集将仅限于分区键中定义的内容。因此cassandra会将结果存储在其(lastName + userId)组合的排序顺序中。这就是为什么你们两个都要用于检索目的。如果你想将表中的所有数据排序为姓,因为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,那么所有用户都会进入同一个桶,而hense它会按照姓氏的排序顺序检索所有行。 (这绝不是一个好的设计,只是为了给你一个想法)。

修订:

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