web-dev-qa-db-ja.com

CQLで非主キー列の個別の値を見つけるCassandra

テーブルの作成には次のコードを使用します。

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;を使用する場合ただし、lnamePRIMARY 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から個別の値を取得するにはどうすればよいですか?

8
Avi

ユーザー-ndefined_variable-2つの良い点があります:

  • Cassandraでは、クエリパターンに一致するようにデータモデルを構築する必要があります。これは、必要なレベルのクエリの柔軟性を実現するために、データを追加のテーブルに複製することを意味する場合があります。
  • 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一意性を確保するために、追加のクラスタリングキーとして。

6
Aaron

Cassandraにはそのような機能はありません。 DISTINCTは、パーティションキーでのみ可能です。要件に基づいてデータモデルを設計する必要があります。アプリケーションロジックでデータを処理する必要があります(スパークが役立つ場合があります)

4