COPY

CSVデータをインポートおよびエクスポートします。

CSV(コンマ区切り値またはコンマ区切りテキスト・ファイル)をインポートおよびエクスポートするCQLシェル・コマンド。

  • COPY TOは、テーブルのデータをCSVファイルにエクスポートします。各行は区切り文字で区切られたフィールドを含むターゲット・ファイル内の行に書き込まれます。カラム名が指定されていない場合は、すべてのフィールドがエクスポートされます。カラムを削除するには、カラム・リストを指定します。
  • COPY FROMは、CSVファイルのデータを既存のテーブルにインポートします。ソース・ファイル内の各行が行としてインポートされます。データセット内のすべての行に同じ数のフィールドが含まれており、PRIMARY KEYフィールドに値が存在する必要があります。このプロセスはPRIMARY KEYを確認し、既存のレコードを更新します。HEADER = falseで、カラム名が指定されていない場合は、フィールドが決定論的な順番でインポートされます。カラム名が指定されている場合、フィールドはその順番でインポートされます。欠落しているフィールドや空のフィールドはnullに設定されます。ソースのフィールド数がターゲット・テーブルのフィールド数を超えることはできませんが、少なくてもかまいません。
注: 200万行未満のデータセットをインポートする場合のみ、COPY FROMを使用してください。大きなデータセットをインポートするには、sstableloaderを使用します。

構文

COPY table_name [( column_list )]
FROM 'file_name'[, 'file2_name', ...] | STDIN
[WITH option = 'value' [AND ...]]
COPY table_name [( column_list )]
TO 'file_name'[, 'file2_name', ...] | STDOUT
[WITH option = 'value' [AND ...]]
注: COPYは、1つ以上のファイル名またはpython glob式のコンマ区切りリストをサポートしています。
表 1. 凡例
構文規則 説明
大文字 リテラル・キーワード。
小文字 リテラル以外。
イタリック体 変数値。ユーザー定義値と置き換えます。
[] 任意。角かっこ( [] )で任意指定のコマンド引数を囲みます。角かっこは入力しないでください。
( ) グループ。丸かっこ(( ))は、選択肢を含むグループを示します。丸かっこは入力しないでください。
| または。縦棒( | )で代替要素を区切ります。要素のいずれかを入力してください。縦棒は入力しないでください。
... 繰り返し可能。省略記号(...)は、構文要素を必要な回数だけ繰り返すことができることを示します。
'Literal string' 単一引用符( ' )でCQL文内のリテラル文字を囲みます。大文字を維持するには、単一引用符を使用します。
{ key : value } マップ・コレクション。中かっこ( { } )でマップ・コレクションまたはキーと値のペアを囲みます。コロンでキーと値を区切ります。
<datatype1,datatype2> セット、リスト、マップ、またはタプル。山かっこ(< >)で、セット、リスト、マップまたはタプル内のデータ型を囲みます。データ型はコンマで区切ります。
cql_statement; CQL文の終了。セミコロン( ; )ですべてのCQL文を終了します。
[--] コマンドライン・オプションとコマンド引数は、2つのハイフン(--)で区切ります。この構文は、引数がコマンドライン・オプションと間違われる可能性がある場合に役立ちます。
' <schema> ...</schema> ' 検索CQLのみ:単一引用符( ' )でXMLスキーマ宣言全体を囲みます。
@xml_entity='xml_entity_type' 検索CQLのみ:スキーマ・ファイルおよびsolrConfigファイル内のXML要素を上書きするための実体とリテラル値を示します。

コピー・オプションの設定

文で設定されているコピー・オプションは、cqlshrcファイルとデフォルト設定よりも優先されます。オプションがコマンドラインで設定されていない場合は、cqlshrcファイルがデフォルト設定よりも優先されます。

表 2. オプション
コマンド オプション 説明
TO/FROM DELIMITER フィールドを区切るために使用する単一の文字。デフォルト値:,
TO/FROM QUOTE フィールド値を囲む単一の文字。デフォルト値:"
TO/FROM ESCAPE QUOTE文字のリテラル使用をエスケープする単一の文字。デフォルト値:\
TO/FROM HEADER 最初の行のカラム名を示すブーリアン(true | false)。trueはインポート(FROM)時にフィールド名をカラム名と照合し、エクスポート(TO)時にデータの最初の行にカラム名を挿入します。デフォルト値:false
TO/FROM NULL フィールドに値なし。デフォルト値は空の文字列()です。
TO/FROM DATETIMEFORMAT CSV時間データの読み取りまたは書き込みの時間形式。タイムスタンプはstrftime形式を使用します。設定されていない場合、デフォルト値はcqlshrcファイルのtime_format値に設定されます。デフォルト形式:%Y-%m-%d %H:%M:%S%z
TO/FROM MAXATTEMPTS エラー時の最大試行回数。デフォルト値:5
TO/FROM REPORTFREQUENCY ステータスが表示される頻度(秒単位)。デフォルト値:0.25
TO/FROM DECIMALSEP 10進数の小数点。デフォルト値:ピリオド(.)。
TO/FROM THOUSANDSSEP 千桁の区切り文字。デフォルト値:None
TO/FROM BOOLSTYLE TrueとFalseのブーリアン標識。値の大文字と小文字は区別されません。たとえば、yes,noとYES,NOは同じです。デフォルト値:True、False
TO/FROM NUMPROCESSES ワーカー・プロセスの数。最大値は16です。デフォルト値:-1
TO/FROM CONFIGFILE cqlshrc構成ファイルを指定してWITHオプションを設定します。
注: コマンドライン・オプションは、常にcqlshrcファイルをオーバーライドします。
TO/FROM RATEFILE 出力統計をこのファイルに出力します。
FROM CHUNKSIZE ワーカー・プロセスに渡されるチャンク・サイズ。デフォルト値:1000
FROM INGESTRATE おおよその1秒あたりの行内の取り込み速度。チャンク・サイズよりも大きい必要があります。デフォルト値:100000
FROM MAXBATCHSIZE インポート・バッチの最大サイズ。デフォルト値:20
FROM MINBATCHSIZE インポート・バッチの最小サイズ。デフォルト値:2
FROM MAXROWS 行の最大数。最大数が指定されていない場合は「-1」を使用します。デフォルト値:-1
FROM SKIPROWS スキップする行数。デフォルト値:0
FROM SKIPCOLS スキップするカラム名のコンマ区切りリスト。
FROM MAXPARSEERRORS 解析エラーの最大グローバル数。最大数が指定されていない場合は「-1」を使用します。デフォルト値:-1
FROM MAXINSERTERRORS 挿入エラーの最大グローバル数。最大数が指定されていない場合は「-1」を使用します。デフォルト値:-1
FROM ERRFILE インポートされていないすべての行を格納するファイル。値が設定されていない場合、情報はimport_ks_table.errに格納されます。ここで、ksはキースペース、tableはテーブル名です。
FROM TTL 秒単位のTime To Live。デフォルトでは、データは期限切れになりません。デフォルト値:3600
TO ENCODING 出力文字列型。デフォルト値:UTF8
TO PAGESIZE 結果のフェッチ用のページ・サイズ。デフォルト値:1000
TO PAGETIMEOUT 結果のフェッチ用のページ・タイムアウト。デフォルト値:10
TO BEGINTOKEN データのエクスポート用の最小トークン文字列。デフォルト値:
TO ENDTOKEN データのエクスポート用の最大トークン文字列。
TO MAXREQUESTS 各ワーカーが並列処理できる要求の最大数。デフォルト値:6
TO MAXOUTPUTSIZE 行数で測定される、出力ファイルの最大サイズ。設定されている場合、出力ファイルのサイズがその値を超えるとセグメントに分割されます。最大サイズが指定されていない場合は「-1」を使用します。デフォルト値:-1

サンプル・データセットの作成

COPYコマンドの例に使用する環境を設定します。

  1. CQLを使用して、cyclingキースペースを作成します。
    CREATE KEYSPACE cycling
      WITH REPLICATION = { 
       'class' : 'NetworkTopologyStrategy', 
       'datacenter1' : 1 
      } ;
  2. cycling.cyclist_nameテーブルを作成します。
    CREATE TABLE cycling.cyclist_name ( 
       id UUID PRIMARY KEY, 
       lastname text, 
       firstname text 
    ) ;
  3. データをcycling.cyclist_nameに挿入します。
    INSERT INTO cycling.cyclist_name (id, lastname, firstname) 
       VALUES (5b6962dd-3f90-4c93-8f61-eabfa4a803e2, 'VOS','Marianne');
    INSERT INTO cycling.cyclist_name (id, lastname, firstname) 
       VALUES (e7cd5752-bc0d-4157-a80f-7523add8dbcd, 'VAN DER BREGGEN','Anna');
    INSERT INTO cycling.cyclist_name (id, lastname, firstname) 
       VALUES (e7ae5cf3-d358-4d99-b900-85902fda9bb0, 'FRAME','Alex');
    INSERT INTO cycling.cyclist_name (id, lastname, firstname) 
       VALUES (220844bf-4860-49d6-9a4b-6b5d3a79cbfb, 'TIRALONGO','Paolo');
    INSERT INTO cycling.cyclist_name (id, lastname, firstname)   
       VALUES (6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47, 'KRUIKSWIJK','Steven');
    INSERT INTO cycling.cyclist_name (id, lastname, firstname) 
       VALUES (fb372533-eb95-4bb4-8685-6ef61e994caa, 'MATTHEWS', 'Michael');

cyclist_nameテーブルに対するデータのエクスポートおよびインポート

サイクリスト名データを往復させます。

  1. cyclist_nameテーブルのidおよびlastnameカラムのみをCSVファイルにエクスポートします。
    COPY cycling.cyclist_name (id,lastname) 
    TO '../cyclist_lastname.csv' WITH HEADER = TRUE ;

    cyclist_lastname.csvファイルが現在の作業ディレクトリーの上のディレクトリーに作成されます。ファイルが既に存在する場合は、上書きされます。

    Using 7 child processes
    
    Starting copy of cycling.cyclist_name with columns [id, lastname].
    Processed: 6 rows; Rate:      29 rows/s; Avg. rate:      29 rows/s
    6 rows exported to 1 files in 0.223 seconds.
  2. idとfirstnameを別のCSVファイルにコピーします。
    COPY cycling.cyclist_name (id,firstname) 
    TO '../cyclist_firstname.csv' WITH HEADER = TRUE ;

    名のファイルが作成されます。

    Using 7 child processes
    
    Starting copy of cycling.cyclist_name with columns [id, firstname].
    Processed: 6 rows; Rate:      30 rows/s; Avg. rate:      30 rows/s
    6 rows exported to 1 files in 0.213 seconds.
  3. すべてのレコードをサイクリスト名テーブルから削除します。
    TRUNCATE cycling.cyclist_name ;
  4. 行が存在しないことを確認します。
    SELECT * FROM cycling.cyclist_name ;

    クエリー結果は空です。

    id | firstname | lastname
    ----+-----------+----------
    
    (0 rows)
  5. サイクリストの名をインポートします。
    COPY cycling.cyclist_name (id,firstname) FROM '../cyclist_firstname.csv' WITH HEADER = TRUE ;

    行がインポートされます。姓がデータセットに含まれていなかったため、すべての行がnullに設定されます。

    Using 7 child processes
    
    Starting copy of cycling.cyclist_name with columns [id, firstname].
    Processed: 6 rows; Rate:      10 rows/s; Avg. rate:      14 rows/s
    6 rows imported from 1 files in 0.423 seconds (0 skipped).
  6. 新しい行を確認します。
    SELECT * FROM cycling.cyclist_name ;

    姓のフィールドがインポートしたデータ・セットに含まれていなかったため、姓にはnullが指定されて行が作成されました。

    id                                   | firstname | lastname
    --------------------------------------+-----------+----------
     e7ae5cf3-d358-4d99-b900-85902fda9bb0 |      Alex |     null
     fb372533-eb95-4bb4-8685-6ef61e994caa |   Michael |     null
     5b6962dd-3f90-4c93-8f61-eabfa4a803e2 |  Marianne |     null
     220844bf-4860-49d6-9a4b-6b5d3a79cbfb |     Paolo |     null
     6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 |    Steven |     null
     e7cd5752-bc0d-4157-a80f-7523add8dbcd |      Anna |     null
    
    (6 rows)
  7. 姓をインポートします。
    COPY cycling.cyclist_name (id,lastname) FROM '../cyclist_lastname.csv' WITH HEADER = TRUE ;

    レコードがインポートされますが、新しいレコードは作成されません。

    Using 7 child processes
    
    Starting copy of cycling.cyclist_name with columns [id, lastname].
    Processed: 6 rows; Rate:      10 rows/s; Avg. rate:      14 rows/s
    6 rows imported from 1 files in 0.422 seconds (0 skipped).
  8. レコードが更新されたことを確認します。
    SELECT * FROM cycling.cyclist_name ;

    PRIMARY KEYであるidがすべてのレコードについて照合され、姓が更新されます。

    id                                   | firstname | lastname
    --------------------------------------+-----------+-----------------
     e7ae5cf3-d358-4d99-b900-85902fda9bb0 |      Alex |           FRAME
     fb372533-eb95-4bb4-8685-6ef61e994caa |   Michael |        MATTHEWS
     5b6962dd-3f90-4c93-8f61-eabfa4a803e2 |  Marianne |             VOS
     220844bf-4860-49d6-9a4b-6b5d3a79cbfb |     Paolo |       TIRALONGO
     6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 |    Steven |      KRUIKSWIJK
     e7cd5752-bc0d-4157-a80f-7523add8dbcd |      Anna | VAN DER BREGGEN

標準入力からテーブルへのデータのコピー。

  1. cyclist_nameテーブルからデータを消去します。
    TRUNCATE cycling.cyclist_name ;
  2. STDINオプションを使用してコピー入力操作を開始します。
    COPY cycling.cyclist_name FROM STDIN ;

    行のプロンプトが[COPY]に変わります。

    Using 7 child processes
    
    Starting copy of cycling.cyclist_name with columns [id, firstname, lastname].
    [Use . on a line by itself to end input]
    [copy] 
  3. プロンプトの次にフィールド値のコンマ区切りリストを入力します。データの最終行にはピリオドを入力します。
    [copy] e7cd5752-bc0d-4157-a80f-7523add8dbcd,Anna,VAN DER BREGGEN
    [copy] .
  4. 最終行にピリオドを挿入した後、Return(またはEnter)キーを押して、レコードの処理を開始します。
    Processed: 1 rows; Rate:       0 rows/s; Avg. rate:       0 rows/s
    1 rows imported from 1 files in 36.991 seconds (0 skipped).
  5. レコードがインポートされたことを確認します。
    SELECT * FROM cycling.cyclist_name ;
     id                                   | firstname | lastname
    --------------------------------------+-----------+-----------------
     e7cd5752-bc0d-4157-a80f-7523add8dbcd |      Anna | VAN DER BREGGEN
    
    (1 rows)