テーブルの作成には次のコードを使用します。
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
から個別の値を取得するにはどうすればよいですか?
ユーザー-ndefined_variable-2つの良い点があります:
DISTINCT
はパーティションキーでのみ機能します。したがって、これを機能させる1つの方法は、そのクエリをサポートする特定のテーブルを作成することです。
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
一意性を確保するために、追加のクラスタリングキーとして。
Cassandraにはそのような機能はありません。 DISTINCTは、パーティションキーでのみ可能です。要件に基づいてデータモデルを設計する必要があります。アプリケーションロジックでデータを処理する必要があります(スパークが役立つ場合があります)