はじめに
COPYコマンドのエラー内容とエラーデータは、ファイルに出力する方法とテーブルに出力する方法があります。
本記事では、COPYコマンドのエラー内容とエラーデータをテーブルに出力する方法をご紹介します。
エラー内容とエラーデータをテーブルに出力する方法
構文
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 | 拒否された行の原因となったエラー。この列は、テーブルに保存しない場合に、ロード例外ファイルに存在するのと同じメッセージを返します。 |
使用例
/* ファイルを確認 */
$ 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は実行できません。
/* DELETEを実行した場合の例 */
dbadmin=> DELETE FROM rejected_test_tbl;
ERROR 5263: Unsupported access to external table・手動で作成したテーブルは、出力先のテーブルとして指定できません。
指定した場合は、COPYコマンドの実行時に「ERROR 6044」が出力されます。
/* 手動で作成したテーブルを指定した場合の例 */
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 本記事を公開