OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

COPYのデータ変換でエラー時に処理を継続させる方法

公開日:
更新日:
データロード
#COPY
#関数

はじめに

本記事では、COPYでFILLER関数を使用してデータ変換時にエラーが発生した場合、処理を継続させる方法をご紹介します。
FILLER関数に関しては、以下の情報を参照ください。

「データロード時に関数などを使用しロードする方法」
https://www.ashisuto.co.jp/cm/analytics-database/data_load_function.html

「CopyFaultTolerantExpressions」パラメータ

Verticaデータベースの「CopyFaultTolerantExpressions」パラメータを設定することでデータ変換でエラーが発生した場合も処理を継続することが可能です。

概要

0

デフォルト
データ変換中にエラーが発生した場合は、COPY処理を中止する。

1

データ変換中にエラーが発生した場合は、COPY処理を継続する。

実行例

CopyFaultTolerantExpressionsの値が0(デフォルト)の場合

■ロードするデータを確認

cat test1.csv
1|TEST1
2|
3|TEST3
A|TEST4
5|TEST5
B|
6|

■パラメータの値を確認

dbadmin=> select parameter_name,current_value from configuration_parameters where parameter_name = 'CopyFaultTolerantExpressions';
        parameter_name        | current_value
------------------------------+---------------
 CopyFaultTolerantExpressions | 0
(1 row)

■テーブルの確認

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を実行

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処理は中止されます。

■ロードしたテーブルを確認

dbadmin=> select * from test1;
 col1 | col2
------+------
(0 rows)
★COPY処理は中止されデータはテーブルに格納されません。

■ロード時に発生したエラーを確認

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の場合

■パラメータの値を設定

dbadmin=> ALTER SESSION SET CopyFaultTolerantExpressions = 1;
ALTER SESSION

■パラメータの値を確認

dbadmin=> select parameter_name,current_value from configuration_parameters where parameter_name = 'CopyFaultTolerantExpressions';
        parameter_name        | current_value
------------------------------+---------------
 CopyFaultTolerantExpressions | 1
(1 row)

■データを変換するCOPYを実行

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処理は正常に終了します。

■ロードしたテーブルを確認

dbadmin=> select * from test1;
 col1 |  col2
------+--------
    1 | test1
    3 | test3
    5 | test5
(3 rows)
★エラーとなったデータ以外はテーブルに格納されます。

■ロード時に発生したエラーを確認

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 Parameters
https://www.vertica.com/docs/11.0.x/HTML/Content/Authoring/AdministratorsGuide/ConfiguringTheDB/GeneralParameters.htm#CopyFaultTolerantExpressions

検証バージョンについて

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

更新履歴

2022/03/31 本記事を公開