17. COPY処理の処理実装案
共有ストレージ上で共通のファイルを参照することにより処理を高速化
COPY … ON ANY NODE
17
COPY t FROM
'/data/1.dat' ON ANY NODE,
'/data/2.dat' ON ANY NODE,
'/data/3.dat' ON ANY NODE,
'/data/4.dat' ON ANY NODE;
OR
'/data/*.dat' ON ANY NODE;
1.dat 2.dat
3.dat 4.dat
全てのノード間で最適に分散化
Node#1 Node#2 Node#3 Node#4
全てのノード
からアクセス
可能な共有
NFS マウント
に格納
1ファイルのサイズが大きい場
合、全ノード上で自動で並列
処理される
19. 1. 文字コードがUTF-8であること
- 該当ファイルの文字コード確認例
- UTF-8である場合
- SJISである場合
- 文字コードをSJISからUTF-8への変更例
(sjis.data:SJISの元ファイル、utf8.data:UTF-8の変換後ファイル)
- データロード後に文字列を保持するカラムがUTF-8以
外のデータを保持しないかどうかの確認例
(行が返ってきた場合、UTF-8以外の値が含まれていることを示す。)
2. 可変長(CSV等)、固定長であること
- 可変長の場合
- 区切り文字として、E‘000’ ~ E‘177’のASCII文字である
必要あり
- ロード実行例
- 固定長の場合
- ロード時に、「FIXEDWIDTH」オプションを指定する必
要あり
- マルチバイト文字の場合、半角カナは3byteであるなど、
SJIS等とバイトのカウントが異なるため注意する必要
あり
- ロード実行例
19
$ file utf8.data
utf8.data: UTF-8 Unicode text
$ file sjis.data
sjis.data: Non-ISO extended-ASCII text, with
no line terminators
$ iconv -f SJIS -t utf-8 sjis.data >
utf8.data
=> SELECT カラム名 FROM テーブル名 WHERE ISUTF8(
カラム名) = FALSE;
=> COPY customer_dimension FROM
'/home/dbadmin/Customer_Dimension.tbl’
DELIMITER ',' DIRECT;
=> COPY fw FROM STDIN FIXEDWIDTH colsizes(2,2)
null AS 'N' NO COMMIT;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by
itself.
>> NN12
>> nnnn
>> .
ソースデータの要件
25. エラーファイルの出力先指定
COPY実行時に、REJECTED DATA AS TABLE句を指定し、リジェクトされたデータとエラーの内容
がVertica上のテーブルに保持されるように実装することが推奨
- 実行例については後述
※COPY LOCALの場合、非対応
REJECTED DATA AS TABLE句を指定しない場合、COPYのエラーファイルについては、接続ノード
(イニシエーターノード)上に下記2つのファイルが作成される
- EXCEPTIONS:エラーの内容
- REJECTED DATA:リジェクトされたデータの内容
※デフォルトでは、カタログディレクトリ配下(<catalog directory>/CopyErrorLogs)に生成される
※指定ディレクトリ以下にエラーログを配置することも可能
- 例:
※COPY LOCALの場合、EXCEPTIONS句、REJECTED DATA句の指定が必須
25
=> COPY <table> '/home/user/data/*' EXCEPTIONS <path> REJECTED DATA <path>;
26. 1. loaderテーブルを作成する。
2. REJECTED DATA用のテーブルに、
loader_rejectsテーブル名を指定し、
COPYを実行する。
3. テーブルの内容を確認する。
4. loader_rejectsテーブルの内容を確認する。
=> CREATE TABLE loader(a INT);
CREATE TABLE
=> COPY loader FROM STDIN REJECTED DATA AS
TABLE loader_rejects;
Enter data to be copied followed by a
newline.
End with a backslash and a period on a line
by itself.
>> 1
>> 2
>> 3
>> a
>> .
=> SELECT * FROM loader;
x
---
1
2
3
(3 rows)
=> SELECT * FROM loader_rejects;
-[ RECORD 1 ]-------------+---------------------------
-----------------
node_name | v_vmart_node0001
file_name | STDIN
session_id | v_vmart_node0001.example.-
24016:0x3439
transaction_id | 45035996274080923
statement_id | 1
batch_number | 0
row_number | 4
rejected_data | a
rejected_data_orig_length | 1
rejected_reason | Invalid integer format 'a'
for column 1 (x)
例: REJECTED DATA AS TABLE句の指定
30. 関連ページ
Data Loading in Vertica Using COPY (英語)
- 上記記事の日本語版はVertica日本語サイトに近日中に公開予定
Visual Guide to Data Loading with Vertica (英語)
Converting Multicharacter Delimiters for Loading (英語)
Bulk-Loading Data (英語)
Trickle Loading Data (英語)
COPY (英語)
30