Cassandraでシンプルなデータ・インポート&エクスポート
既存のデータをCassandraクラスターに取り込む方法は数多くあります。由緒のある、低レベルのBinaryMemtableインターフェースは初期には使用されましたが、かなり使いにくく、今では選択肢にすら入っていません。json2sstableとsstableloaderツールは効率的ですが、設定の手続きには慎重な構成とネットワークに対する考慮が必要です。BulkOutputFormatは、HadoopからCassandraに出力データをストリーミングする際に役に立ちます。(sstableloaderを使用しています)。
これらのツールは強力で、膨大な量のデータを扱うことができますが、ジョブの完了に必要な時間ではなく自分の作業時間を最小限に抑えたい場合もあります。データ量がそれほど多くなければ(例えば数百万行以下)、遅いインポートでも十分早く終わるだろうし、「sstable」が何であるかをわざわざ学習したくもありません。このようなニッチ案件のために、COPY FROM cqlshコマンドが最近リリースされ、Cassandra 1.1.3にも搭載される予定です。また、Cassandraからのデータ・エクスポートに対応するCOPY TOコマンドも用意されています。
COPY FROMとCOPY TOコマンドは、PostgreSQLのCOPYと同等のコマンドをベースにしています。これらのコマンドと 同じようにCSVデータを扱います。そして、使用するCSVの種類を正確に指定するためのいくつかのオプションがあります(CSVはとても一般的な形式ですが、単一の標準があるわけではありません)。
使用方法
構文はこのようになっています。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
COPY <tablename> [ ( column [, ...] ) ] FROM ( '<filename>' | STDIN ) [ WITH <option>='value' [AND ...] ]; COPY <tablename> [ ( column [, ...] ) ] TO ( '<filename>' | STDOUT ) [ WITH <option>='value' [AND ...] ];
データをインポートする場合(COPY FROM)、デフォルトのケースでは、CSV入力の各行には、Cassandraテーブル・メタデータの列数と同じ数の列が含まれると想定されます。フィールドはそれぞれの順序で割り当てられます。入力データを特定のカラム・セットに適用したい場合は、テーブル名の後の括弧内で列名を指定します。CSV入力は、ファイルパスまたはキーワード "STDIN "で指定します。stdinで入力を行う場合、CSVデータの終了はバックスラッシュとドット("˶")で行を区切って知らせることができます。COPY FROMは、新しいデータをインポートする際にテーブルを切り捨てず、既存のデータに追加します。
データをエクスポートする場合(COPY TO)、デフォルトでは、Cassandraテーブル・メタデータからすべての列を定義された順序で出力します。特定の列のセットのみをエクスポートしたい場合は、テーブル名の後の括弧内で列名を指定します。出力されるCSVの宛先は、ファイル・パスまたはキーワード「STDOUT」によって指定します。
CSVスタイル
COPYコマンドが理解するデフォルトのCSVは、フィールドをカンマ(,)で区切り、レコードを行区切り文字で区切り、あいまいさを避ける必要がある場合はフィールド値をダブルクォート("")で引用し、ダブルクォートの文字列の中でバックスラッシュ("\"")でエスケープします。また、最初の行に、列名を表す「ヘッダー」レコードを持ちません。
CSV構文に可能なオプション:
- デリミター(デフォルト:,). フィールドを分割するために使われる文字
- QUOTE (default: "). 必要なときに、フィールドの値を引用するために使用される引用文字。
- ESCAPE (default: \). QUOTE文字のリテラルな使用をエスケープするために使用される文字
- HEADER (デフォルト: false)。CSVの最初の行がヘッダーであるかどうか、使用する列の名前を指定します(trueの場合、COPY TOが有効なヘッダー行を出力し、COPY FROMが最初の行を無視するようにします。COPY FROMは、実際にはヘッダーを全く使用しません)。
- ENCODING(デフォルト:utf8)。ユニコード文字列を出力する場合、COPY TOでのみ使用されます。
- NULL(デフォルト:空文字列)。COPY TOでのみ、存在しない値を表すために使用されます。COPY FROMは現在、NULL値の概念を持ちませんが、CASSANDRA-3783が解決された後に変更される可能性があります。
これらのユースケースをより明確にするために、いくつかの例をご紹介します。
例1
インタラクティブなcqlshセッション中に、直接データを入力します。CSVはデフォルトのフレーバーです。[括弧付き] のビットは、インタラクティブなセッション中にcqlshが出力するプロンプトであり、データの一部ではありません。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
cqlsh> COPY log.parts FROM STDIN; [Use \. on a line by itself to end input] [copy] "F3-14-2,14-5",engine,compression coil [copy] F3-19-B,engine,trace compression block [copy] F3-01-1,engine,radion accelerator core [copy] "F3-0R-A,0F-G",engine,aft alternator [copy] ASA-I-1192-1,infirmary,extractor [copy] ASA-I-9288-T,infirmary,adrenaline syringe [copy] CT-A-2,armory,"Callahan full-bore auto-lock \"Vera\"" [copy] \. 7 rows imported in 0.072 seconds. cqlsh>
例2
ヘッダー行を含むデータの出力では、フィールドを区切るために” | ”を 、値を引用するためにシングルクォート文字、出力中のリテラル・シングルクォートを表すためにダブルシングルクォートを使用します(CQL文字列リテラルと同様です)。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
cqlsh> COPY log.chatlogs (ts, content, other) TO './chatlog.dat' ... WITH DELIMITER = '|' AND QUOTE = '''' AND ESCAPE = '''' AND NULL = '<null>'; 3 rows exported in 0.005 seconds. cqlsh> exit; ~/datadir$ cat chatlog.dat 17271650717.223|'Thank you for the wine. It''s very... fresh.'|<null> 17264147043.011|'We''ve got some local color happening. Your grand entrance woul d not go amiss right now.'|<null> 17268884092.729|'It''s a real burn, being right so often.'|<null>
Edit 2012-07-30 16:42 +0000 - BinaryMemtableは現在使用不可です。