はじめに
COPYコマンドのエラー内容とエラーデータは、ファイルに出力する方法とテーブルに出力する方法があります。
本記事では、COPYコマンドのエラー内容とエラーデータをテーブルに出力する方法をご紹介します。
エラー内容とエラーデータをテーブルに出力する方法
構文
1 |
copy <テーブル名> from '<CSVファイル>' ... rejected data as table <出力先のテーブル名>; |
※出力先のテーブルは、COPYコマンドでエラー発生した時に自動で作成されます。
既に自動で作成されたテーブルが存在する場合は、エラー内容/データが追加されます。
出力されるテーブルの情報
エラー内容とエラーデータが出力されるテーブルの情報は以下になります。
カラム名 | データ・タイプ | 概要 |
---|---|---|
node_name | VARCHAR | 入力ロードファイルが配置されたVerticaノードの名前。 |
file_name | VARCHAR | ロードされているファイルの名前。これは、(STDINを使用するのではなく)ファイルをロードした場合に適用されます。 |
session_id | VARCHAR | COPYステートメントが発生したセッションID番号。 |
transaction_id | INTEGER | セッション内のトランザクションの識別子(存在する場合)。それ以外の場合はNULL。 |
statement_id | INTEGER | 拒否されたデータを含むトランザクション内のステートメントの一意の識別番号。 |
batch_number | INTEGER | 内部使用。データがどのバッチ(チャンク)からのものかを表します。 |
row_number | INTEGER | 入力ファイルから拒否された行番号。 |
rejected_data | LONG VARCHAR | ロードされなかったデータ。 |
rejected_data_orig_length | INTEGER | 拒否されたデータの長さ。 |
rejected_reason | VARCHAR | 拒否された行の原因となったエラー。この列は、テーブルに保存しない場合に、ロード例外ファイルに存在するのと同じメッセージを返します。 |
使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
/* ファイルを確認 */ $ cat test_tbl.csv 1,AA,AAAAAAAAAA 2,BB,BBBBBBBBBB A,AAAAA,AAAAAAAAAAAAAAAA 3,CC,CCCCCCCCCC 4,DDDDD,DDDDDDDDDD /* ロード対象テーブルを確認 */ dbadmin=> \d test_tbl List of Fields by Tables Schema | Table | Column | Type | Size | Default | Not Null | Primary Key | Foreign Key ——–----+——-———————+———————–+————————————-+——————+—————————+—————————-+————————————-+———————————- public | test_tbl | col1 | int | 8 | | f | f | public | test_tbl | col2 | varchar(2) | 2 | | f | f | public | test_tbl | col3 | varchar(10) | 10 | | f | f | (3 rows) /* COPYコマンドでデータロードを実行 */ copy test_tbl from ‘/home/dbadmin/test_tbl.csv’ delimiter ‘,’ enforcelength rejected data as table rejected_test_tbl; Rows Loaded ————- 3 <= CSVファイルの5件中の3件がロードできましたが、2件がエラーでロードできませんでした。 (1 row) /* テーブルを検索してエラー内容を確認 */ dbadmin=> \x Expanded display is on. dbadmin=> select * from rejected_test_tbl; -[ RECORD 1 ]—————————————+—————————————————————— node_name | v_dwh_node0001 file_name | /home/dbadmin/test_tbl.csv session_id | v_dwh_node0001-401236:0x2674d5 transaction_id | 45035996273994157 statement_id | 1 batch_number | 0 row_number | 3 rejected_data | A,AAAAA,AAAAAAAAAAAAAAAA rejected_data_orig_length | 24 rejected_reason | Invalid integer format ‘A’ for column 1 (col1) -[ RECORD 2 ]————————————-+—————————————————————— node_name | v_dwh_node0001 file_name | /home/dbadmin/test_tbl.csv session_id | v_dwh_node0001-401236:0x2674d5 transaction_id | 45035996273994157 statement_id | 1 batch_number | 0 row_number | 5 rejected_data | 4,DDDDD,DDDDDDDDDD rejected_data_orig_length | 18 rejected_reason | The 5-byte value is too long for type Varchar(2), column 2 (col2) /* 上記エラーの概要 */ ・CSVファイルの3行目のレコードがINT型の列に文字"A"をロードしようとしたためエラーとなっています。 ・CSVファイルの5行目のレコードがVARCHAR(2)の列に5バイトの値をロードしようとしたためエラーとなっています。 |
制限事項
エラー内容とエラーデータが出力されるテーブルに対しては、以下の制限があります。
・SELECTとDROP TABLEは実行できますが、それ以外のDMLやDDLは実行できません。
1 2 3 |
/* DELETEを実行した場合の例 */ dbadmin=> DELETE FROM rejected_test_tbl; ERROR 5263: Unsupported access to external table |
・手動で作成したテーブルは、出力先のテーブルとして指定できません。
指定した場合は、COPYコマンドの実行時に「ERROR 6044」が出力されます。
1 2 3 |
/* 手動で作成したテーブルを指定した場合の例 */ dbadmin=> copy test_tbl from '/home/dbadmin/test_tbl.csv' delimiter ',' enforcelength rejected data as table new_table; ERROR 6044: Table already exists: "new_table". Can't create a rejections table with the same name |
参考
Saving Rejected Data To a Table
検証バージョンについて
この記事の内容はVertica 10.0で確認しています。
更新履歴
2020/12/18 本記事を公開