web-dev-qa-db-ja.com

Cassandra-コレクション型で列をクエリします

私はカサンドラにかなり慣れていないので、これがばかげた質問であることが判明した場合はご容赦ください。

以下のようなテーブル構造があります

CREATE TABLE data_points (
  id text PRIMARY KEY,
  created_at timestamp,
  previous_event_id varchar,
  properties map<text,text>
);

mapタイプのフィールドから一致するレコードを取得するクエリを実行できるかどうかを知りたいと思いました。

たとえば、次のようにテーブルに値を挿入すると

INSERT INTO datapoints (id, properties) VALUES ('1', { 'fruit' : 'Apple', 'band' : 'Beatles' });

私はそれを次のようにフェッチできますか?

SELECT * from data_points WHERE properties.band='Beatles';

助けてください。

7
Rohit

cassandra 2.1 以降では、コレクション型にインデックスを付けることができます。あなたは後です:
SELECT * FROM <table> WHERE <field> CONTAINS <value_in_list/map/set>

詳細な例:

cqlsh> USE ks;
cqlsh:ks> CREATE TABLE data_points (
            id text PRIMARY KEY,
            created_at timestamp,
            previous_event_id varchar,
            properties map<text,text>
         );
cqlsh:ks> create index on data_points (properties);
cqlsh:ks> INSERT INTO data_points (id, properties) VALUES ('1', { 'fruit' : 'Apple', 'band' : 'Beatles' });
cqlsh:ks> INSERT INTO data_points (id, properties) VALUES ('2', { 'fruit' : 'cherry', 'band' : 'Beatles' });
cqlsh:ks> SELECT * FROM data_points WHERE properties CONTAINS 'Beatles';

 id | created_at | previous_event_id | properties
----+------------+-------------------+----------------------------------------
  2 |       null |              null | {'band': 'Beatles', 'fruit': 'cherry'}
  1 |       null |              null |  {'band': 'Beatles', 'fruit': 'Apple'}

(2 rows)

警告の言葉、セカンダリインデックスはスキャッター/ギャザーアルゴリズムを使用して必要なものを見つけるため、スケールアウトしません。重いタグ付けに使用する場合は、propertiesフィールドintを非正規化することをお勧めします別のテーブルで複数のクエリを実行します。

参考文献:

15
Lyuben Todorov

マップ(またはセット/リスト)の場合、「CQLではコレクション列の部分的な読み取りはできません。コレクションからデータを取得する唯一の方法は、コレクション全体を読み取ることです」。

https://stackoverflow.com/questions/16024839/select-specific-value-from-map

ただし、クエリが設定、更新、または削除されている場合、それらは正常に機能します。

0
kisna