LoginSignup
4
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-03

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を作るのはまだちょっと大変なきがする。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2