データロードで不正データがある場合に、不正データの行だけスキップする方法
COPYコマンドでデータロードを行うと、カラム幅よりも大きなデータは溢れた分を切り捨てた状態でロードします。このような挙動をするデータ型としては、varchar型、char型、binary型、varbinary型があります。
※int型はデータを切り捨てずに、エラーになります。
このように切り捨てられるデータはスキップし(ロードしない)、正しいデータの行だけをロードしたいときはCOPYコマンドに”ENFORCELENGTH”オプションをつけて実行してください。
例 : varchar型、char型のカラムに有効桁数以上のデータをロードした場合
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 |
$ cat t1.csv 1,abc,abc 2,abcd,abcd 3,abcde,abcde 4,あ,あ 5,あい,あい 6,あいう,あいう 12345678901234567890,test,test ▼COPYコマンドを使用しDIRECTのみでロードすると不正データによるエラーは表示されず、不正データ以外はロードされます。 dbadmin=> truncate table t1; TRUNCATE TABLE dbadmin=> copy t1 from '/home/dbadmin/t1.csv' delimiter ',' direct ; Rows Loaded ------------- 6 (1 row) dbadmin=> select * from t1; col1 | col2 | col3 ------+------+------ 1 | abc | abc 2 | abcd | abcd 3 | abcd | abcd 4 | あ | あ 5 | あ | あ 6 | あ | あ (6 rows) ▼COPYコマンドに"ENFORCELENGTH "を付けることで、有効桁数のデータのみがロードされます。 dbadmin=> truncate table t1; TRUNCATE TABLE dbadmin=> copy t1 from '/home/dbadmin/t1.csv' delimiter ',' ENFORCELENGTH direct ; Rows Loaded ------------- 3 (1 row) dbadmin=> select * from t1; col1 | col2 | col3 ------+------+------ 1 | abc | abc 2 | abcd | abcd 4 | あ | あ (3 rows) |
関連情報
データロードで不正データがある場合にロールバックする方法http://vertica-tech.ashisuto.co.jp/load_error_rollback/