Edited at

カラムを結合するembulk-filter-concatを作った。

More than 3 years have passed since last update.

Embulkの勉強がてらに、filter pluginを作ってみた。

https://github.com/toru-takahashi/embulk-filter-concat


目的

たまにむかーし作ったデータベースなどであるのが、日付と時刻が別なカラムに入っているというものだ。

これがCSVでログとして残っていて、あとからどこかのDBに入れたいとかというときがある。

そのときに、これらをtimestampとして一つのカラムにして扱いたい。

embulk-filter-concatはこういうときのために利用する。

concatとはSQLであるconcat関数と似たようなものになっていて、複数のカラム+結合子を指定して、新しいカラムとして追加する。


利用方法

インストールは、

embulk gem install embulk-filter-concat

入力データが下記のようになっているとする。


input.csv

date,time,id

2015-07-13,00:00:00,0
2015-07-13,00:00:00,1
2015-07-13,00:00:00,2

このとき、dateとtimeが別カラムなので、結合してから出力したい。


example.yml

in:

type: file
path_prefix: ./input.csv
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: date, type: string}
- {name: time, type: string}
- {name: id, type: long}
filters:
- type: concat
name: datetime
columns:
- {name: date}
- {name: time}
out: {type: stdout}

filtersにconcatを登録し、結合後の名前をnameで設定する。

columnsで登録されたnameのカラムを結合する。ここでは指定した順に結合されるようになっている。

また、上記では書いていないが、delimiterというオプションもあり、これを利用することで結合子を指定できる。デフォルトでは" "(半角スペースになっている)

上記の設定ファイルで実行すると、最後にカラムが追加されて二つの値が結合できていることがわかる。

$ embulk run example.yml

2016-07-04 01:25:04.184 +0900: Embulk v0.8.9
2016-07-04 01:25:05.995 +0900 [INFO] (0001:transaction): Loaded plugin embulk-filter-concat (0.1.0)
2016-07-04 01:25:06.045 +0900 [INFO] (0001:transaction): Listing local files at directory '.' filtering filename by prefix 'input.csv'
2016-07-04 01:25:06.052 +0900 [INFO] (0001:transaction): Loading files [input.csv]
2016-07-04 01:25:06.172 +0900 [INFO] (0001:transaction): Using local thread executor with max_threads=8 / output tasks 4 = input tasks 1 * 4
2016-07-04 01:25:06.183 +0900 [INFO] (0001:transaction): {done: 0 / 1, running: 0}
2015-07-13,00:00:00,0,2015-07-13 00:00:00
2015-07-13,00:00:00,1,2015-07-13 00:00:00
2015-07-13,00:00:00,2,2015-07-13 00:00:00
2016-07-04 01:25:06.290 +0900 [INFO] (0001:transaction): {done: 1 / 1, running: 0}
2016-07-04 01:25:06.295 +0900 [INFO] (main): Committed.
2016-07-04 01:25:06.295 +0900 [INFO] (main): Next config diff: {"in":{"last_path":"input.csv"},"out":{}}

制限としては、timestamp型とjson型には対応してないので、注意が必要。


まとめ。

concatっぽいpluginを作った。

EmbulkのJava pluginを作るのはまだちょっと大変なきがする。