6

Cassandra 1.2.8 に 50,000 列の単一行を挿入したいと考えています。挿入する前に、行全体のすべてのデータを (メモリ内で) 使用する準備ができています。

+---------+------+------+------+------+-------+
|         | 0    | 1    | 2    | ...  | 49999 |
| row_id  +------+------+------+------+-------+
|         | text | text | text | ...  | text  |
+---------+------+------+------|------+-------+

列名は整数で、ページネーションのスライスが可能です。列の値は、その特定のインデックスの値です。

CQL3 テーブル定義:

create table results (
    row_id text,
    index int,
    value text,
    primary key (row_id, index)
) 
with compact storage;

row_id と 50,000 個の名前/値のペアがすべてメモリにあるので、1 回の要求/操作で 1 行を Cassandra に挿入して、できるだけ高速に処理したいと考えています。

私が見つけたように見える唯一のことは、次の50,000回実行することです:

INSERT INTO results (row_id, index, value) values (my_row_id, ?, ?);

1 つ目?はインデックス カウンター ( i) で、2 つ目?は location に格納するテキスト値ですi

これには多くの時間がかかります。上記の INSERT をバッチに入れても、かなりの時間がかかります。

必要なすべてのデータ (完全な行) がそろっています。たとえば、「Cassandra、このデータを 1 つの要求で 1 つの行として保存してください」と言うのは非常に簡単だと思います。たとえば、次のようになります。

//EXAMPLE-BUT-INVALID CQL3 SYNTAX:
insert into results (row_id, (index,value)) values 
    ((0,text0), (1,text1), (2,text2), ..., (N,textN));

この例は、現在の CQL3 構文では実現できませんが、目的の効果が示されることを願っています。つまり、すべてが 1 つのクエリとして挿入されるということです。

CQL3およびDataStax Java Driverでこれを行うことは可能ですか? そうでない場合、代わりに Hector または Astyanax ドライバーと Thriftbatch_insert操作を使用することを余儀なくされると思いますか?

4

4 に答える 4

3

編集: Cassandra 1.2.9 に関するこの質問を投稿してからわずか 4 日後、Cassandra 2.0 final がリリースされました。2.0 は、C* < 2.0 で使用する必要があった非バッチ CQL3 よりもはるかに高速なバッチ準備済みステートメントをサポートします。これについてはまだテストしていません。

この質問が 4 日前の 2013 年 8 月 30 日に投稿されたとき、2.0 未満の C* バージョンの CQL3 ではできませんでした。Astyanax のMutationBatchなどの Thrift クライアントを介してのみ可能でした。

Alex の提案に従って、機能要求としてCASSANDRA-5959を作成しましたが、C* 2.0 の問題を解決したと思われるCASSANDRA-4693の複製としてマークされました。

于 2013-08-30T18:31:57.017 に答える
2
  1. CQL3INSERTステートメントは、複数の値のタプルをサポートしていません。しかし、これは CQL への興味深い追加になると思いますので、機能リクエストを送信してください。

  2. DataStax Java ドライバーは CQL に基づいているため、ステートメントがサポートされていない場合でも、できることは何でもあります。

  3. 当分の間、これが必要な場合の最善の選択肢は、Thrift ベースのライブラリを使用することです ( nb : この挿入が可能であることを確認するために Thrift ベースの API にあまり詳しくありませんが、そうするべきだと思います)

于 2013-08-30T06:45:05.927 に答える
0

複数の挿入を行う場合は、CQL3 で Batch ステートメントを使用します。

C* 2.0 では、バッチで準備済みステートメントが有効になるため、さらに簡単かつ高速になります。

于 2013-08-31T19:26:39.853 に答える