しばらく触れられていませんでしたが、久しぶりにEmbulkについて書いていきます。
タイトル通り、2つのFILTER系プラグインを使ってみて、どのようにデータをいじれるのかを検証してみます。
なお、検証のために使うデータ・ymlファイルのベースは、Embulkのexampleコマンド⇒guessコマンドによって生成されるデータ・ymlファイルです。
ちなみに以前書いたEmbulkの内容は以下の通りです。
- データ転送のOSS「Embulk」を使って、MysqlからデータをCsvに落としてみる
- embulk-filter-evalでどんなデータ変換ができるのか試してみる
- Embulkを使ってWordPressのデータを出力してみる
1.embulk-filter-column
2015年12月現在、FILTER系では一番ダウンロードされている(GitHubから)プラグイン、embulk-filter-columnです。主にできることは"カラムの絞り込み"と"カラムの追加"です。
GitHub上のREADMEではExampleとして"columns"、"add_columns"、"drop_columns"の説明があります。
"add_columns"は"カラムの追加"、"drop_columns"は"カラムの絞り込み"、"columns"は"カラムの絞り込みとカラムの追加の両方"に対応しています。
1-1.add_columnsの例
add_columnsでは2通りのカラムの追加方法があります。1つ目は、追加するカラムのデフォルト値を用意する方法。
2つ目は、元々存在しているカラムの値をコピーし、新しいカラムとする方法。
例として、1つ目の方法として"add_time"カラムを追加し、2つ目の方法として"copy_id"カラムを追加します。
データ(guessコマンドの自動生成のまま。特筆しない限り以降も同じデータです)
id,account,time,purchase,comment
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
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
Embulkの読み込み用ymlファイル(緑字を追記)
in:
type: file
path_prefix: ~/lib/try1/csv/sample_
decoders:
- {type: gzip}
parser:
charset: UTF-8
newline: CRLF
type: csv
delimiter: ','
quote: '"'
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}
filters:
- type: column
add_columns:
- {name: add_time, type: timestamp, default: '20151201', format: "%Y%m%d" }
- {name: copy_id, src: id}
out: {type: stdout}
type: file
path_prefix: ~/lib/try1/csv/sample_
decoders:
- {type: gzip}
parser:
charset: UTF-8
newline: CRLF
type: csv
delimiter: ','
quote: '"'
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}
filters:
- type: column
add_columns:
- {name: add_time, type: timestamp, default: '20151201', format: "%Y%m%d" }
- {name: copy_id, src: id}
out: {type: stdout}
なお、デフォルト値は"default"キーに指定します。上記のymlファイルでは"20151201"を指定しました。
コピー元のカラムは"src"キーに指定します。上記のymlファイルでは"id"を指定しました。
実行結果(preview)
+---------+--------------+-------------------------+-------------------------+----------------------------+-------------------------+--------------+
| id:long | account:long | time:timestamp | purchase:timestamp | comment:string | add_time:timestamp | copy_id:long |
+---------+--------------+-------------------------+-------------------------+----------------------------+-------------------------+--------------+
| 1 | 32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC | embulk | 2015-12-01 00:00:00 UTC | 1 |
| 2 | 14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC | embulk jruby | 2015-12-01 00:00:00 UTC | 2 |
| 3 | 27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin | 2015-12-01 00:00:00 UTC | 3 |
| 4 | 11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC | NULL | 2015-12-01 00:00:00 UTC | 4 |
+---------+--------------+-------------------------+-------------------------+----------------------------+-------------------------+--------------+
| id:long | account:long | time:timestamp | purchase:timestamp | comment:string | add_time:timestamp | copy_id:long |
+---------+--------------+-------------------------+-------------------------+----------------------------+-------------------------+--------------+
| 1 | 32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC | embulk | 2015-12-01 00:00:00 UTC | 1 |
| 2 | 14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC | embulk jruby | 2015-12-01 00:00:00 UTC | 2 |
| 3 | 27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin | 2015-12-01 00:00:00 UTC | 3 |
| 4 | 11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC | NULL | 2015-12-01 00:00:00 UTC | 4 |
+---------+--------------+-------------------------+-------------------------+----------------------------+-------------------------+--------------+
実行結果を見ると、ymlファイル内で定義した通りの値で、"add_time"カラムと"copy_id"カラムが追加されていることが分かります。
※カラム名を分かりやすくするため、previewの実行結果を表示しています。timestamp型のデータにタイムゾーンが表示されているのはそのためです。
なお、runの場合、"add_time"の値は"2015-12-01 00:00:00.000000 +0000"と表示されていました




