在 CQL Cassandra 中查找非主键列的不同值
Finding distinct values of non Primary Key column in CQL Cassandra
我使用以下代码创建 table:
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
中获取不同的值?
cassandra 中没有这样的功能。 DISTINCT 只能在分区键上使用。
您应该根据您的要求设计您的数据模型。
您必须在应用程序逻辑中处理数据(spark 可能会有用)
用户 - Undefined_variable - 提出了两个要点:
- 在 Cassandra 中,您需要构建数据模型以匹配您的查询模式。这有时意味着将您的数据复制到额外的 table 中,以获得所需的查询灵活性级别。
DISTINCT
仅适用于分区键。
因此,实现此功能的一种方法是构建一个特定的 table 来支持该查询:
CREATE TABLE users_by_lname (
lname text,
fname text,
user_id int,
PRIMARY KEY (lname, fname, user_id)
);
现在,在我 运行 您向这个新查询 table 插入后,这有效:
aploetz@cqlsh:Whosebug> SELECT DISTINCT lname FROm users_by_lname ;
lname
-------
smith
doe
(2 rows)
注意:在这个 table 中,具有相同分区键 (lname
) 的所有行将按 fname
排序,因为 fname
是聚类键。我添加了 user_id
作为额外的聚类键,只是为了确保唯一性。
我使用以下代码创建 table:
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
中获取不同的值?
cassandra 中没有这样的功能。 DISTINCT 只能在分区键上使用。 您应该根据您的要求设计您的数据模型。 您必须在应用程序逻辑中处理数据(spark 可能会有用)
用户 - Undefined_variable - 提出了两个要点:
- 在 Cassandra 中,您需要构建数据模型以匹配您的查询模式。这有时意味着将您的数据复制到额外的 table 中,以获得所需的查询灵活性级别。
DISTINCT
仅适用于分区键。
因此,实现此功能的一种方法是构建一个特定的 table 来支持该查询:
CREATE TABLE users_by_lname (
lname text,
fname text,
user_id int,
PRIMARY KEY (lname, fname, user_id)
);
现在,在我 运行 您向这个新查询 table 插入后,这有效:
aploetz@cqlsh:Whosebug> SELECT DISTINCT lname FROm users_by_lname ;
lname
-------
smith
doe
(2 rows)
注意:在这个 table 中,具有相同分区键 (lname
) 的所有行将按 fname
排序,因为 fname
是聚类键。我添加了 user_id
作为额外的聚类键,只是为了确保唯一性。