在CQL Cassandra中查找非主键列的不同值

时间:2016-03-07 09:46:37

标签: select cassandra distinct cql cql3

我使用以下代码创建表:

CREATE KEYSPACE mykeyspace
WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
USE mykeyspace;
CREATE TABLE users (
  user_id int PRIMARY KEY,
  fname text,
  lname text
);
INSERT INTO users (user_id,  fname, lname)
  VALUES (1745, 'john', 'smith');
INSERT INTO users (user_id,  fname, lname)
  VALUES (1744, 'john', 'doe');
INSERT INTO users (user_id,  fname, lname)
  VALUES (1746, 'john', 'smith');

我想找到lname列的不同值(不是PRIMARY KEY)。我想得到以下结果:

 lname
-------
 smith

使用SELECT DISTINCT lname FROM users; 但是,由于lname不是PRIMARY KEY,我收到以下错误:

InvalidRequest: code=2200 [Invalid query] message="SELECT DISTINCT queries must
only request partition key columns and/or static columns (not lname)"
cqlsh:mykeyspace> SELECT DISTINCT lname FROM users;

如何从lname获取不同的值?

2 个答案:

答案 0 :(得分:6)

Undefined_variable有两个好处:

  • 在Cassandra中,您需要构建数据模型以匹配您的查询模式。这有时意味着将您的数据复制到其他表中,以获得所需的查询灵活性级别。
  • DISTINCT仅适用于分区键。

因此,实现此功能的一种方法是构建一个特定的表来支持该查询:

CREATE TABLE users_by_lname (
    lname text,
    fname text,
    user_id int,
    PRIMARY KEY (lname, fname, user_id)
);

现在,在我将INSERT运行到这个新的查询表之后,这可以工作:

aploetz@cqlsh:stackoverflow> SELECT DISTINCT lname FROm users_by_lname ;

 lname
-------
 smith
   doe

(2 rows)

注意:在此表中,具有相同分区键(lname)的所有行将按fname排序,因为fname是一个群集键。我添加了user_id作为额外的群集密钥,只是为了确保唯一性。

答案 1 :(得分:4)

cassandra中没有这样的功能。 DISTINCT仅适用于分区键。 您应该根据您的要求设计数据模型。 您必须在应用程序逻辑中处理数据(spark可能很有用)