1. はじめに
Embulk 0.8.3から、run
時に-c
(--config-diff
)オプションが使えるようになりました。
(0.8.2から入っていいましたが不具合がありました。)
これによって、liquidを使った設定ファイルとの連携ができるようになりました。
-c
オプションは-o
オプションと似ていますが、指定したパスに差分情報だけを保存する点が-o
オプションと異なります。
-c
オプションの導入に伴って、-o
オプションは非推奨になりました。今後は-c
を利用してください。
2. 利用例
2.1 設定ファイル
次のようなliquidを使った設定ファイルがあります。
.
|-- config.yml.liquid
`-- hoge
`-- csv
`-- sample_01.csv.gz
設定ファイルには、{{ env.DATA_PATH }}
といった環境変数を読み込むパラメータが設定されています。
in:
type: file
path_prefix: {{ env.DATA_PATH }} # <-- liquid
decoders:
- {type: gzip}
parser:
charset: UTF-8
newline: CRLF
type: csv
delimiter: ','
quote: '"'
escape: '"'
trim_if_not_quoted: false
skip_header_lines: 1
allow_extra_columns: false
allow_optional_columns: false
columns:
- {name: id, type: long}
- {name: account, type: long}
- {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
- {name: purchase, type: timestamp, format: '%Y%m%d'}
- {name: comment, type: string}
out: {type: stdout}
2.2 runコマンド実行(1回目)
runコマンドを実行します。その際、-c
オプションをつけて最後に読み込んだファイルの情報をdiff.yml
に記録させます。
embulk run config.yml.liquid -c diff.yml
2016-02-09 19:14:09.418 +0900: Embulk v0.8.3
2016-02-09 19:14:13.339 +0900 [INFO] (0001:transaction): Listing local files at directory 'hoge/csv' filtering filename by prefix ''
2016-02-09 19:14:13.351 +0900 [INFO] (0001:transaction): Loading files [hoge/csv/sample_01.csv.gz]
2016-02-09 19:14:13.459 +0900 [INFO] (0001:transaction): Using local thread executor with max_threads=8 / output tasks 4 = input tasks 1 * 4
2016-02-09 19:14:13.479 +0900 [INFO] (0001:transaction): {done: 0 / 1, running: 0}
1,32864,2015-01-27 19:23:49,20150127,embulk
2,14824,2015-01-27 19:01:23,20150127,embulk jruby
3,27559,2015-01-28 02:20:02,20150128,Embulk "csv" parser plugin
4,11270,2015-01-29 11:54:36,20150129,NULL
2016-02-09 19:14:13.683 +0900 [INFO] (0001:transaction): {done: 1 / 1, running: 0}
2016-02-09 19:14:13.701 +0900 [INFO] (main): Committed.
2016-02-09 19:14:13.701 +0900 [INFO] (main): Next config diff: {"in":{"last_path":"hoge/csv/sample_01.csv.gz"},"out":{}}
保存された中身を見ると、diff.yml
には差分情報のみが記録されています。
in: {last_path: hoge/csv/sample_01.csv.gz}
out: {}
2.3 runコマンド実行(2回目)
同じコマンドを再度実行します。2回目の実行では、diff.yml
ファイル内に記載されたlast_pathの値が利用されるため、
sample_01.csv.gzは読み込まれてないことが確認できます。
embulk run config.yml.liquid -c diff.yml
2016-02-09 19:14:56.046 +0900: Embulk v0.8.3
2016-02-09 19:14:59.228 +0900 [INFO] (0001:transaction): Listing local files at directory 'hoge/csv' filtering filename by prefix ''
2016-02-09 19:14:59.237 +0900 [INFO] (0001:transaction): Loading files []
2016-02-09 19:14:59.360 +0900 [INFO] (0001:transaction): Using local thread executor with max_threads=8 / tasks=0
2016-02-09 19:14:59.378 +0900 [INFO] (main): Committed.
2016-02-09 19:14:59.378 +0900 [INFO] (main): Next config diff: {"in":{"last_path":"hoge/csv/sample_01.csv.gz"},"out":{}}
3. 参考(-oオプションの挙動)
-o
オプションを使った場合は次のように設定ファイル全体が保存されており、さらに環境変数は展開された値となってしまっていました。
そのため、次回この設定ファイルをliquid形式のファイルとして利用することはできませんでした。
つまりembulk run config.yml.liquid -o config.yml.liquid
のような使い方ができなかったということです。
in:
type: file
path_prefix: hoge/csv/ # <-- 展開されてしまった環境変数
decoders:
- {type: gzip}
parser:
charset: UTF-8
newline: CRLF
type: csv
delimiter: ','
quote: '"'
escape: '"'
trim_if_not_quoted: false
skip_header_lines: 1
allow_extra_columns: false
allow_optional_columns: false
columns:
- {name: id, type: long}
- {name: account, type: long}
- {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
- {name: purchase, type: timestamp, format: '%Y%m%d'}
- {name: comment, type: string}
last_path: hoge/csv/sample_01.csv.gz
out: {type: stdout}