OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

ロード処理のエラー内容をテーブルに出力する方法

公開日:
データロード
#COPY

はじめに

COPYコマンドのエラー内容とエラーデータは、ファイルに出力する方法とテーブルに出力する方法があります。

本記事では、COPYコマンドのエラー内容とエラーデータをテーブルに出力する方法をご紹介します。

エラー内容とエラーデータをテーブルに出力する方法

構文

copy <テーブル名> from '<CSVファイル>' ... rejected data as table <出力先のテーブル名>;

※出力先のテーブルは、COPYコマンドでエラー発生した時に自動で作成されます。
 既に自動で作成されたテーブルが存在する場合は、エラー内容/データが追加されます。

出力されるテーブルの情報

エラー内容とエラーデータが出力されるテーブルの情報は以下になります。

カラム名データ・タイプ概要
node_nameVARCHAR入力ロードファイルが配置されたVerticaノードの名前。
file_nameVARCHARロードされているファイルの名前。これは、(STDINを使用するのではなく)ファイルをロードした場合に適用されます。
session_idVARCHARCOPYステートメントが発生したセッションID番号。
transaction_idINTEGERセッション内のトランザクションの識別子(存在する場合)。それ以外の場合はNULL。
statement_id INTEGER拒否されたデータを含むトランザクション内のステートメントの一意の識別番号。
batch_numberINTEGER内部使用。データがどのバッチ(チャンク)からのものかを表します。
row_numberINTEGER入力ファイルから拒否された行番号。
rejected_dataLONG VARCHARロードされなかったデータ。
rejected_data_orig_lengthINTEGER拒否されたデータの長さ。
rejected_reasonVARCHAR拒否された行の原因となったエラー。この列は、テーブルに保存しない場合に、ロード例外ファイルに存在するのと同じメッセージを返します。

使用例

/* ファイルを確認 */
$ 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

https://www.vertica.com/docs/10.0.x/HTML/Content/Authoring/AdministratorsGuide/BulkLoadCOPY/SavingRejectionsTable.htm

検証バージョンについて

この記事の内容はVertica 10.0で確認しています。

更新履歴

2020/12/18 本記事を公開