web-dev-qa-db-ja.com

マップから特定の値を選択

20,000列以上のWIDE列テーブルを作成しようとしています

当初、私は次のものを使用すると考えていました。

CREATE TABLE details (
   key TEXT,
   detail map<TEXT, TEXT>
   PRIMARY KEY (KEY)
  );

このテーブルへの挿入は正常に機能します

UPDATE details SET detail = detail + { 'col1': '12'} where key='123' ;
UPDATE details SET detail = detail + { 'col20000': 'ABCD'} where key='123' ;

しかし、私は個々の詳細を読みたいと思います:

   select detail[col1] where key='123'

このクエリを実行すると、次のエラーが発生します。

 no viable alternative at input '['

これは機能しますか、それとも別のアプローチが必要ですか?

16
e90jimmy

コレクションは、一度にフェッチするデータの小さなグループです。

より細かいレベルでタプルにアクセスし、それでも「特定のキーのデータのすべてのペアは何か」を尋ねることができる場合は、次のようなテーブルを使用する必要があります。

CREATE TABLE details (
  key TEXT,
  detail_key text,
  detail_value text,
  PRIMARY KEY (key, detail_key)
);

これにより、SELECT * FROM details WHERE key = ? と同様 SELECT * FROM detail WHERE key = ? AND detail_key = ?

15
jbellis

基本的に、この機能はcassandraではまだサポートされていません。

これを参照してください cql3コレクション

7
abhi

マップタイプ の代わりに ユーザー定義タイプ を使用できます。次のようにテーブルを定義してみてください。

CREATE TYPE detailtype (
    col1 TEXT,
    col2 TEXT
);

CREATE TABLE details (
   key TEXT,
   detail frozen<detailtype>,
   PRIMARY KEY (KEY)
);

次に、次の方法でクエリを実行できます。

select detail.col1 where key='123';
0
Liangmp