COPY

CSV(コンマ区切り値)データをCassandraにインポート、またはCassandraからエクスポートします。

CSV(コンマ区切り値)データをCassandraにインポート、またはCassandraからエクスポートします。

構文

COPY table_name ( column, ...)FROM('file_name' | STDIN)WITH option = 'value' AND ...COPY table_name ( column , ...) TO('file_name' | STDOUT)WITH option = 'value' AND ...

構文の凡例

  • 大文字はリテラルを意味する
  • 小文字は、リテラルでないことを意味する
  • イタリック体は指定が任意であることを意味する
  • パイプ(|)記号はORまたはAND/ORを意味する
  • 省略記号(...)は繰り返し可能を意味する
  • 範囲記号「(」および「)」はリテラルではなく、範囲を示す

説明

WITH句の中でCOPYのオプションを使用して、CSV形式を変更できます。以下の表でこれらのオプションを説明します。
表 1. COPYのオプション
COPYのオプション デフォルト値 使用目的
DELIMITER コンマ(,) ファイル内で改行文字を持つフィールドを区切る文字を設定します。
QUOTE 引用符(") フィールド値を囲む文字を設定します。
ESCAPE バックスラッシュ(\) QUOTE文字のリテラル使用をエスケープする文字を設定します。
HEADER false ファイルの1行目がヘッダーであることを示すには、trueに設定します。
NULL 空の文字列 値が存在しないことを表します。
ENCODING UTF8 unicode文字列を出力するようにCOPY TOコマンドを設定します。
TIME_FORMAT cqlshrcのtime_format値で%Y-%m-%d %H:%M:%S%z CSV時間データを書き込むための時刻形式を設定します。COPY TOコマンドに対してのみ有効です。
注: TIME_FORMATはCassandra 2.2.4以降に対して有効です。

COPY FROMコマンドではENCODINGオプションを使用できません。この表に示すように、デフォルトでは、Cassandraは、CSVデータがコンマ(,)で区切られたフィールド、行区切り記号(改行、\r\n)で区切られたレコード、および二重引用符("")で囲まれたフィールド値で構成されることを想定しています。また、あいまいさを避けるために、二重引用符("\"")で囲まれた文字列内で、バックスラッシュを使用してリテラル二重引用符をエスケープします。デフォルトでは、Cassandraは、 CSVファイルの1行目に、カラム名で構成されるヘッダー・レコードがあることを想定していません。COPY TOコマンドで、HEADER=trueの場合は、出力にヘッダーが含まれます。COPY FROMコマンドでは、HEADER=trueの場合、1行目が無視されます。

カウンター・テーブルとの間でのデータのコピーはできません。

CSVファイルからのコピー

COPY FROMコマンドを使用する場合、デフォルトでは、Cassandraは、CSV入力の各行のカラム数が同じであることを想定しています。CSV入力のカラム数はCassandraテーブル・メタデータでのカラム数と同じです。Cassandraは対応する順序でフィールドを割り当てます。入力データを特定のカラム・セットに適用するには、テーブル名の後にカラム名を丸かっこで囲んで指定します。

COPY FROMコマンドは小規模のデータセット(数百万行以下)をCassandraにインポートするためのものです。大規模なデータセットのインポートの場合は、Cassandraバルク・ローダーを使用してください。

CSVファイルへのコピー

たとえば、CQLに以下のテーブルがあると仮定します。:

cqlsh> SELECT * FROM test.airplanes;
name | mach | manufacturer | year ---------------+------+--------------+------ P38-Lightning | 0.7 | Lockheed | 1937

テーブルにデータを挿入した後、テーブル名の後にカラム名を丸かっこで囲んで指定することにより、そのデータを別の順序でCSVファイルにコピーできます。

COPY airplanes (name, mach, year, manufacturer) TO 'temp.csv'

コピー元ファイルとコピー先ファイルの指定

CSV入力のコピー元ファイルまたはCSV出力のコピー先ファイルをファイル・パスで指定します。あるいは、STDINキーワードを使用して標準入力からインポートするか、STDOUTキーワードを使用して標準出力にエクスポートできます。STDINを使用する場合は、独立の行でバックスラッシュとピリオド("\.")を付けてCSVデータの末尾を示します。すでにデータを含んでいるテーブルにデータをインポートする場合、COPY FROMでは、事前にテーブルが切り詰められません。カラムのセットを部分的にコピーすることができます。テーブル名の後に、インポートまたはエクスポートする順序で、カラム名の全セットまたはサブセットを丸かっこで囲んで指定します。COPY TOコマンドを使用する場合、デフォルトでは、Cassandraは、Cassandraテーブル・メタデータに定義された順序でデータをCSVファイルにコピーします。コピー元のテーブルまたはコピー元のCSVファイルに表示される順序ですべてのカラムをインポートまたはエクスポートする場合は、カラム名のリストを省略することもできます。

簡単なテーブルの往復コピー

テーブルをCSVファイルにコピーします。

  1. CQLを使用して、airplanesという名前のテーブルを作成し、それをCSVファイルにコピーします。
    CREATE KEYSPACE test WITH REPLICATION = {'class' :'NetworkTopologyStrategy', 'datacenter1' :1 }; USE test; CREATE TABLE airplanes ( name text PRIMARY KEY, manufacturer ascii, year int, mach float ); INSERT INTO airplanes (name, manufacturer, year, mach) VALUES ('P38-Lightning', 'Lockheed', 1937, 0.7); COPY airplanes (name, manufacturer, year, mach) TO 'temp.csv';
    1 rows exported in 0.004 seconds.
  2. このデータをairplanesテーブルから消去し、このデータをtemp.csvファイルからインポートします。
    TRUNCATE airplanes; COPY airplanes (name, manufacturer, year, mach) FROM 'temp.csv';
    1 rows imported in 0.087 seconds.

標準入力からテーブルにデータをコピーします。

  1. COPYコマンドのデフォルト設定を使用して、対話型のcqlshセッション中にデータを直接入力します。
    TRUNCATE airplanes; COPY airplanes (name, manufacturer, year, mach) FROM STDIN;

    出力は以下のようになります。

    [Use \. on a line by itself to end input] [copy]
  2. [copy]プロンプトの場所に、以下のデータを入力します。
    'F-14D Super Tomcat', Grumman, 1987, 2.34 'MiG-23 Flogger', Russian-made, 1964, 2.35 'Su-27 Flanker', U.S.S.R., 1981, 2.35 \.
  3. airplanesテーブルをクエリーして、STDINからインポートされたデータを表示します。
    SELECT * FROM airplanes;
    出力は以下のようになります。
    name | manufacturer | year | mach --------------------+------+--------------+------------- F-14D Super Tomcat | Grumman | 1987 | 2.35 P38-Lightning | Lockheed | 1937 | 0.7 Su-27 Flanker | U.S.S.R. | 1981 | 2.35

コレクションのコピー

Cassandraでは、CSVファイルへの(またはCSVファイルからの)コレクションのコピーをサポートしています。この例を実行するには、今すぐサンプルコードをダウンロードしてください。

  1. ダウンロードしたcql_collections.zipファイルを解凍します。
  2. すべてのCQLコマンドをcql_collections.txtファイルからコピーしてcqlshコマンドラインにペーストします。
  3. songsという名前のテーブルの内容を見てみましょう。このテーブルには、会場のマップ(venue)、レビューのリスト(reviews)、タグのセット(tags)が含まれています。
    cqlsh> SELECT * FROM music.songs;
    id |album|artist|data|reviews |tags |title|venue ------------+-----+------+----+-------------------+-----------------+-----+---------------------------------------------------------------------- 7db1a490...| null| null |null|['hot dance music']| {'rock'}| null|{'2013-09-22...':'The Fillmore', '2013-10-01...':'The Apple Barrel'} a3e64f8f...| null| null |null| null|{'1973', 'blues'}| null|null 8a172618...| null| null |null| null|'2007', 'covers'}| null|null
  4. music.songsテーブルをsongs-20140603.csvという名前のCSVファイルにコピーします。
    cqlsh> COPY music.songs to 'songs-20140603.csv';
    3 rows exported in 0.006 seconds.
  5. コピー操作が完了したことを確認します。
    cqlsh> exit; $ cat songs-20140603.csv 7db1a490...,,,,['hot dance music'],{'rock'},,"{'2013-09-22...':'The Fillmore', '2013-10-01....':'The Apple Barrel'}" a3e64f8f...,,,,,"{'1973', 'blues'}",, 8a172618...,,,,,"{'2007', 'covers'}",,
  6. 再度cqlshを起動し、songs-204140603ファイル内のデータと一致するテーブル定義を作成します。
    cqlsh> CREATE TABLE music.imported_songs ( id uuid PRIMARY KEY, album text, artist text, data blob, reviews list<text>, tags set<text>, title text, venue map<timestamp, text> );
  7. データをCSVファイルからimported_songsテーブルにコピーします。
    cqlsh> COPY music.imported_songs from 'songs-20140603.csv';
    3 rows imported in 0.004 seconds.