1

CQL3 でテーブルを作成した後:

CREATE TABLE data(
 row_key text,
 k1 text,
 k2 text,
 PRIMARY KEY (row_key , k1 ,k2 )
);

そのテーブルに格納されているすべての cassandra 行を知りたいです。しかし、これをcqlshで実行すると:

SELECT row_key  FROM data;

多くの重複したエントリが返されます。基本的に、挿入したすべての列のエントリを取得します。意味: (k1 & k2) ごとに row_key のエントリを取得します。

しかし、私の当初の意図は、「すべてのパーティション (行) キーのリストを教えてください」でした。すべての列 (k1 & k2) もシリアライズしたくありません。

ここで何が間違っていますか?

4

2 に答える 2

2

これは、CQL3 がデータを内部的に表現する方法です。列のパーティションを作成します。CQL3 のストレージ モデルを理解する必要があります。DataStax ブログには、これに関する非常に優れた読み物があります。これらを見てください:

http://www.datastax.com/dev/blog/thrift-to-cql3

http://www.datastax.com/dev/blog/cql3-for-cassandra-experts

編集:
ここでは、倹約ではなくCQL3を扱っています。私の回答の 2 番目のリンク (cql3-for-cassandra-experts) を読めば、CQL3 を使用してテーブルが作成されたときに、ストレージ エンジンにデータがどのように格納されるかがわかります。次のテーブルを作成したとします。

    CREATE TABLE song_tags (
      id uuid,
      tag_name text,
      PRIMARY KEY (id, tag_name)
    );

単一のストレージ エンジンで表される次の行があるとします。

    f665cfc469eb |    blues  | 1973 

    f665cfc469ea |    covers | 2003

これらは CQL3 によって次のように保存されます。

    |id             |    tag_name |
     -----------------------------
    |f665cfc469eb        blues    |
    |f665cfc469eb   |    1973     |
    |                             |
    |f665cfc469ea        covers   |
    |f665cfc469ea   |    2003     |

SELECT * FROM song_tags; を実行すると、これが出力になります。

    id                                   | column1 | value
    --------------------------------------+---------+-------
    8a172618-b121-4136-bb10-f665cfc469ea |    2003 |
    8a172618-b121-4136-bb10-f665cfc469ea |  covers |
    a3e64f8f-bd44-4f28-b8d9-f665cfc469eb |    1973 |
    a3e64f8f-bd44-4f28-b8d9-f665cfc469eb |   blues |

PSあなたが望むものを達成するため; セットとマップを使用してみてください。彼らはあなたの問題を解決するかもしれません。

于 2013-07-17T07:40:38.863 に答える
1

現在、SELECT クエリで「LIMIT 1」を使用して、これを修正しました。行全体ではなく、1 つの列をシリアル化します。これは何もないよりはましです。

于 2013-07-23T12:02:21.613 に答える