目次
はじめに
本記事では、COPYでFILLER関数を使用してデータ変換時にエラーが発生した場合、処理を継続させる方法をご紹介します。FILLER関数に関しては、以下の情報を参照ください。
「データロード時に関数などを使用しロードする方法」
http://vertica-tech.ashisuto.co.jp/data_load_function/
「CopyFaultTolerantExpressions」パラメータ
Verticaデータベースの「CopyFaultTolerantExpressions」パラメータを設定することでデータ変換でエラーが発生した場合も処理を継続することが可能です。値 | 概要 |
---|---|
0 | デフォルト データ変換中にエラーが発生した場合は、COPY処理を中止する。 |
1 | データ変換中にエラーが発生した場合は、COPY処理を継続する。 |
実行例
CopyFaultTolerantExpressionsの値が0(デフォルト)の場合
■ロードするデータを確認
1 2 3 4 5 6 7 8 |
cat test1.csv 1|TEST1 2| 3|TEST3 A|TEST4 5|TEST5 B| 6| |
■パラメータの値を確認
1 2 3 4 5 |
dbadmin=> select parameter_name,current_value from configuration_parameters where parameter_name = 'CopyFaultTolerantExpressions'; parameter_name | current_value ------------------------------+--------------- CopyFaultTolerantExpressions | 0 (1 row) |
■テーブルの確認
1 2 3 4 5 6 |
dbadmin=> \d test1 List of Fields by Tables Schema | Table | Column | Type | Size | Default | Not Null | Primary Key | Foreign Key --------+-------+--------+-------------+------+---------+----------+-------------+------------- public | test1 | col1 | int | 8 | | f | f | public | test1 | col2 | varchar(10) | 10 | | t | f | |
■データを変換するCOPYを実行
1 2 3 |
dbadmin=> COPY test1 (col1,col2_filler FILLER VARCHAR(10),col2 AS LOWER(col2_filler)) from '/home/dbadmin/test1.csv' REJECTED DATA TABLE test1_bad; ERROR 2501: Cannot set a NOT NULL column (col2) to a NULL value in COPY statement ★データ変換でエラーが発生した場合は、エラーが表示されCOPY処理は中止されます。 |
■ロードしたテーブルを確認
1 2 3 4 5 |
dbadmin=> select * from test1; col1 | col2 ------+------ (0 rows) ★COPY処理は中止されデータはテーブルに格納されません。 |
■ロード時に発生したエラーを確認
1 2 3 4 5 6 7 |
dbadmin=> select * from test1_bad; node_name | file_name | session_id | transaction_id | statement_id | batch_number | row_number | rejected_data | rejected_data_orig_length | rejected_reason --------------------+-------------------------+------------------------------------+-------------------+--------------+--------------+------------+---------------+---------------------------+------------------------------------------------ v_vertica_node0001 | /home/dbadmin/test1.csv | v_vertica_node0001-206662:0x33d64b | 45035996275162509 | 3 | 0 | 4 | A|TEST4 | 7 | Invalid integer format 'A' for column 1 (col1) v_vertica_node0001 | /home/dbadmin/test1.csv | v_vertica_node0001-206662:0x33d64b | 45035996275162509 | 3 | 0 | 6 | B| | 2 | Invalid integer format 'B' for column 1 (col1) (2 rows) ★データ変換時のエラーは出力されません。 |
CopyFaultTolerantExpressionsの値が1の場合
■パラメータの値を設定
1 2 |
dbadmin=> ALTER SESSION SET CopyFaultTolerantExpressions = 1; ALTER SESSION |
■パラメータの値を確認
1 2 3 4 5 |
dbadmin=> select parameter_name,current_value from configuration_parameters where parameter_name = 'CopyFaultTolerantExpressions'; parameter_name | current_value ------------------------------+--------------- CopyFaultTolerantExpressions | 1 (1 row) |
■データを変換するCOPYを実行
1 2 3 4 5 6 |
dbadmin=> COPY test1 (col1,col2_filler FILLER VARCHAR(10),col2 AS LOWER(col2_filler)) from '/home/dbadmin/test1.csv' REJECTED DATA TABLE test1_bad; Rows Loaded ------------- 3 (1 row) ★COPY処理は正常に終了します。 |
■ロードしたテーブルを確認
1 2 3 4 5 6 7 8 |
dbadmin=> select * from test1; col1 | col2 ------+-------- 1 | test1 3 | test3 5 | test5 (3 rows) ★エラーとなったデータ以外はテーブルに格納されます。 |
■ロード時に発生したエラーを確認
1 2 3 4 5 6 7 8 9 |
dbadmin=> select * from test1_bad; node_name | file_name | session_id | transaction_id | statement_id | batch_number | row_number | rejected_data | rejected_data_orig_length | rejected_reason --------------------+-------------------------+------------------------------------+-------------------+--------------+--------------+------------+----------------+---------------------------+------------------------------------------------------------------------------------ v_vertica_node0001 | /home/dbadmin/test1.csv | v_vertica_node0001-206662:0x33d64b | 45035996275162525 | 1 | 0 | 4 | A|TEST4 | 7 | Invalid integer format 'A' for column 1 (col1) v_vertica_node0001 | /home/dbadmin/test1.csv | v_vertica_node0001-206662:0x33d64b | 45035996275162525 | 1 | 0 | 6 | B| | 2 | Invalid integer format 'B' for column 1 (col1) v_vertica_node0001 | /home/dbadmin/test1.csv | v_vertica_node0001-206662:0x33d64b | 45035996275162525 | 1 | 0 | 2 | Tuple (2,Null) | 14 | ERROR 2501: Cannot set a NOT NULL column (col2) to a NULL value in COPY statement v_vertica_node0001 | /home/dbadmin/test1.csv | v_vertica_node0001-206662:0x33d64b | 45035996275162525 | 1 | 0 | 7 | Tuple (6,Null) | 14 | ERROR 2501: Cannot set a NOT NULL column (col2) to a NULL value in COPY statement (4 rows) ★データ変換時のエラーも出力されます。 |
参考情報
General Parametershttps://www.vertica.com/docs/11.0.x/HTML/Content/Authoring/AdministratorsGuide/ConfiguringTheDB/GeneralParameters.htm#CopyFaultTolerantExpressions