pg_bulkload インストールして使ってみた

http://pgbulkload.projects.postgresql.org/index_ja.html

# wget http://pgfoundry.org/frs/download.php/3101/pg_bulkload-3.0.2-1.pg90.rhel5.x86_64.rpm
# rpm -ivh pg_bulkload-3.0.2-1.pg90.rhel5.x86_64.rpm

# データベースのオーナユーザで実行
$ psql -f /usr/pgsql-9.0/share/contrib/pg_bulkload.sql データベース名
SET
BEGIN
CREATE FUNCTION
COMMIT


設定ファイル例
オンラインマニュアルのサンプル(sample_csv.ctl)は INPUT と OUTPUT の書き方が違っているのでサンプルのままだと動きません...

ERROR: query failed: ERROR:  invalid keyword "INPUT"

とか

ERROR: query failed: ERROR:  invalid keyword "OUTPUT"

ってなります

$ vi hoge.ctl
TYPE = CSV
INFILE = /tmp/201109.txt    # INPUT じゃなくって INFILE
TABLE = details    # OUTPU じゃなくって OUTFILE
QUOTE = "\""
ESCAPE = \
DELIMITER = " "
LOGFILE = /tmp/pg_bulkload.log
PARSE_BADFILE = /tmp/PARSE_BADFILE.txt
DUPLICATE_BADFILE = /tmp/DUPLICATE_BADFILE.txt
PARSE_ERRORS = -1
DUPLICATE_ERRORS = -1
ON_DUPLICATE_KEEP = OLD


実行

$ /usr/pgsql-9.0/bin/pg_bulkload ./hoge.ctl
NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
        0 Rows skipped.
        2073627 Rows successfully loaded.
        104 Rows not loaded due to parse errors.
        0 Rows not loaded due to duplicate errors.
        0 Rows replaced with new rows.
WARNING: some rows were not loaded due to errors

この例ではデータのパースエラーで104取り込まれませんでした。
エラーになった列は 設定ファイルでしてした
PARSE_BADFILE = /tmp/PARSE_BADFILE.txt
に記録されています。


COPY文だと1行エラーになると全部キャンセルされちゃうけど
pg_bulkload は正常なものだけでも取り込んでくれるので助かります。