10

CQL3 より前は、日付で名前が付けられた列などの任意の列を挿入できました。

cqlsh:test>CREATE TABLE seen_ships (day text PRIMARY KEY)
                WITH comparator=timestamp AND default_validation=text;
cqlsh:test>INSERT INTO seen_ships (day, '2013-02-02 00:08:22')
                VALUES ('Tuesday', 'Sunrise');

この投稿によると、CQL3 では状況が異なるようです。任意の列を挿入することはまだ何とか可能ですか? これが私の失敗した試みです:

cqlsh:test>CREATE TABLE seen_ships (
    day text,
    time_seen timestamp,
    shipname text,
    PRIMARY KEY (day, time_seen)
);

cqlsh:test>INSERT INTO seen_ships (day, 'foo') VALUES ('Tuesday', 'bar');

ここで私は得るBad Request: line 1:29 no viable alternative at input 'foo'

おそらくこれは複合キーの制限であるため、少し異なるテーブルを試します。

cqlsh:test>CREATE TABLE seen_ships ( day text PRIMARY KEY );
cqlsh:test>INSERT INTO seen_ships (day, 'foo') VALUES ('Tuesday', 'bar');

再びBad Request: line 1:29 no viable alternative at input 'foo'

ここで何が欠けていますか?

4

2 に答える 2

17

これについては、Datastax ブログに良いブログ記事があります: http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows

答えはイエスです。CQL3 は動的な列をサポートしていますが、以前のバージョンの CQL で機能していた方法とは異なります。私はあなたの例をよく理解していません.CQL2でもどのように機能したかわかりません。私が正しく理解している場合は、パーティション キー (行キー) が日であり、各目撃情報が時間と名前のペアである船の目撃情報のタイムラインを作成したいと考えています。ここに提案があります:

CREATE TABLE ship_sightings (
  day TEXT,
  time TIMESTAMP,
  ship TEXT,
  PRIMARY KEY (day, time)
)

そして、エントリを挿入します

INSERT INTO ship_sightings (day, time, ship) VALUES ('Tuesday', NOW(), 'Titanic')

ただし、おそらくTIMEUUID代わりにa を使用する必要がありますTIMESTAMP(主キーは a である可能性がありますDATE)。そうしないと、同じタイムスタンプを持つ 2 つの目撃情報を追加して、1 つだけが生き残る可能性があります。

これは幅の広い行の例でしたが、動的な列の問題があり、まったく同じではありません。CQL3 での例を次に示します。

CREATE TABLE ship_sightings_with_properties (
  day TEXT,
  time TIMEUUID,
  ship TEXT,
  property TEXT,
  value TEXT,
  PRIMARY KEY (day, time, ship, property)
)

次のように挿入できます。

INSERT INTO ship_sightings_with_properties (day, time, ship, property, value)
VALUES ('Sunday', NOW(), 'Titanic', 'Color', 'Black')
# you need to repeat the INSERT INTO for each statement, multiple VALUES isn't
# supported, but I've not included them here to make this example shorter
VALUES ('Sunday', NOW(), 'Titanic', 'Captain', 'Edward John Smith')
VALUES ('Sunday', NOW(), 'Titanic', 'Status', 'Steaming on')
VALUES ('Monday', NOW(), 'Carapathia', 'Status', 'Saving the passengers off the Titanic')

この種の動的列の欠点は、プロパティ名が複数回保存されることです (したがって、連続して 1000 回の目撃情報があり、それぞれに「Captain」というプロパティがある場合、その文字列は 1000 回保存されます)。オンディスク圧縮により、そのオーバーヘッドのほとんどが取り除かれ、ほとんどの場合、心配する必要はありません。

最後に、CQL3 のコレクションに関する注意事項です。これらは便利な機能ですが、幅の広い行や動的な列を実装する方法ではありません。まず第一に、それらには 65536 アイテムの制限がありますが、Cassandra はこの制限を適用できないため、あまりにも多くの要素を追加すると、後でそれらを読み戻せなくなる可能性があります。コレクションは主に小さな複数値フィールド用です。標準的な例は、各行がエントリであり、エントリには単一の名前しかないが、複数の電話番号、電子メール アドレスなどがあるアドレス帳です。

于 2013-07-03T18:33:47.620 に答える
0

これは真に動的な列ではありませんが、ほとんどの場合、コレクションで回避できます。Map 列を使用すると、いくつかの動的データを格納できます

于 2015-02-28T07:59:00.830 に答える