在CQL Cassandra中查找非主键列的唯一值

8
我使用下面的代码来创建表格: ```HTML

我使用下面的代码来创建表格:

```
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列的不同值(并非主键)。我希望得到以下结果:

 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个回答

10

用户 - 未定义变量 - 提出了两个好的观点:

  • 在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作为其他聚簇键,以确保唯一性。


5

在cassandra中没有这样的功能。仅可以在分区键上使用DISTINCT。 您应该根据自己的需求设计数据模型。 您必须在应用程序逻辑中处理数据(Spark可能很有用)。


谢谢。我确实使用SPARK。您能否详细说明如何完成?我认为distinct是非常常见的。在SPARK(Scala)中是否有现成的代码可供使用? - Avi
1
嗨,我不使用Scala,但这里有几个链接可能会有所帮助:https://dev59.com/zF0Z5IYBdhLWcg3w4jhy 和 https://dev59.com/IGAf5IYBdhLWcg3wwk4V - undefined_variable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接