前回、awsにtd-agentを入れて、
s3→redshiftとの連携を図ったけど、
さらにうまくやる方法を記載しておく。
●カラムを超えた場合のデータについて
TRUNCATECOLUMNS
オプションを付けておくことで回避できる
●redshiftに取り込まれた日時を登録する方法
テーブル側にカラムを追加して、jsonpathとのカラムミスマッチを防ぐ
具体的には、
CREATE TABLE test_access_logs ( date datetime sortkey, ip varchar(64), header varchar(256), code varchar(16), size varchar(16), aaa varchar(64), bbb varchar(128), ccc varchar(128), second varchar(16), insert_date datetime not null default convert_timezone('JST', getdate()) );
上記みたいに、insert_dateを追加する。
ただし、このまま取り込むと、
{ "jsonpaths": [ "$['date']", "$['ip']", "$['header']", "$['code']", "$['size']", "$['aaa']", "$['bbb']", "$['ccc']", "$['second']" ] }
カラムのミスマッチがおきてしまう。
これを回避するために、
# COPY test_access_logs (date, ip, header, code, size, aaa, bbb, ccc, second) FROM 's3://MY-BUCKET/logs/httpd/201501/26/' credentials 'aws_access_key_id=XXX;aws_secret_access_key=YYY' JSON AS 's3://MY-BUCKET/logs/httpd/test_access_log_jsonpath.json' GZIP COMPUPDATE ON RUNCATECOLUMNS;
上記のように、カラム指定で取り込むと、
insert_dateはnullになり、defaultが適用される。
なぜこのような方法をとるかというと、
もし再取り込みが発生した場合に、
以前のデータを消さないで取り込むと、
重複で取り込まれてしまう。
重複を回避するには、
以前取り込んだデータを削除しなければならない。
insert_dateを登録しておけば、
以前登録したデータを検索できる。
ちなみに、redshift上で、日本時間を取得するには、
# select convert_timezone(‘JST’, getdate());
# select dateadd(hour, 9, getdate());
のような方法がある。
以上
コメントがあればどうぞ