すのふら

日々の備忘録

Redshift COPYで改行を含むデータをロードする

以下のようなRedshift COPYコマンドでロードしようとした際に、取り込もうとしたデータに改行が含まれていた場合「Delimited value missing end quote」エラーになってしまって困った。

COPY [table-name]
FROM 's3://[bucket-name]/xxx/yyyy/' 
CREDENTIALS 'aws_access_key_id=[aws_access_key_id];aws_secret_access_key=[aws_secret_access_key]' 
DELIMITER '\t' 
TIMEFORMAT 'YYYYMMDDHH24MISS' 
EMPTYASNULL 
REMOVEQUOTES 
gzip;


DELIMITER:タブ区切り
TIMEFORMAT:時刻は'YYYYMMDDHH24MISS' 形式
EMPTYASNULL:空白はNULLとする
REMOVEQUOTES:クォーテーションは省く*1
gzip:gzip形式を読み込む

これってデータが

'改行ココカラ
ココマデ',


みたいになっていて、ロードしようとした際REMOVEQUOTESオプションでクォーテーションを外そうとするけど、改行されているから最後のクォーテーションが読めなくてエラーになっているみたいな感じだと思っている。

だったら、単純にESCAPEオプションを追加したらいいんじゃない?って単純に思ってたんだけど「Delimited value missing end quote」エラーは変わらず。どうなってんじゃ


COPY [table-name]
FROM 's3://[bucket-name]/xxx/yyyy/' 
CREDENTIALS 'aws_access_key_id=[aws_access_key_id];aws_secret_access_key=[aws_secret_access_key]' 
DELIMITER '\t' 
TIMEFORMAT 'YYYYMMDDHH24MISS' 
EMPTYASNULL 
REMOVEQUOTES 
ESCAPE 
gzip;


でもってよくよく調べてみるとESCAPEコマンドの対象になるのはバックスラッシュが事前に入っていないと駄目なのね。

こんな感じ。

\'改行ココカラ
ココマデ',


www.slideshare.net
上記35ページ目



でもこれ、実際に業務で使用した際に他システムから連携されるデータに改行されたデータがあった場合、事前にエスケープを入れる(対向orこちら)しか方法がない。
数件とかならいいんだけど、数百万件データを一気にエスケープするのはちょっと大変だなーと。

パラメータだけで改行エスケープできる何かうまい方法あればいいんだけどねえ。