2015年12月15日火曜日

EmbulkのFILTER系プラグインを使ってみた(embulk-filter-insert,embulk-filter-split)

こんにちは、井下です。

前回に引き続き、EmbulkのFILTER系プラグインを使ってみるということで、"embulk-filter-insert"と"embulk-filter-split"を使ってみます。

なお、今回も基となるデータはexampleコマンド⇒guessコマンドによって生成されるデータ・ymlファイルです。

使用データ
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

デフォルトでのpreviewコマンド実行結果
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+


1.embulk-filter-insert

"insert"とありますが、このプラグインはカラムのインサートを行います。
単純にカラムをインサートするだけではなく、"どこ"にインサートするのか、"どの型"でインサートするのかを設定することができます。
特に"どこ"にインサートするのかの設定方法は多く用意されており、最初のカラムや最後のカラムといった指定から、何カラム目かの指定、◯◯カラムの前or後の指定ができるようになっています。

GitHub上のExampleの通り、最初のカラムとして"host_name"カラムを追加してみます。

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: insert, column: { host_name: host01 }, at: top }
out: {type: stdout}

デフォルトでのpreviewコマンド実行結果
+------------------+---------+--------------+-------------------------+-------------------------+----------------------------+
| host_name:string | id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+------------------+---------+--------------+-------------------------+-------------------------+----------------------------+
|           host01 |       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|           host01 |       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|           host01 |       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|           host01 |       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+------------------+---------+--------------+-------------------------+-------------------------+----------------------------+

最初のカラムにhost_nameカラムが追加されました。同様に"at"パラメータに"bottom"を指定すれば、最後のカラムとして追加されるようになりますし、数値を指定すれば、指定したカラムとして追加されるようになります。("2"を指定すれば、2カラム目として追加)
※なお、"at"パラメータには他に"head"、"tail"も指定できますが、実行してみた限りでは、"head"は"top"と同じ、"tail"は"bottom"と同じ動作をしていました。

また、"at"パラメータの代わりに"before"もしくは"after"パラメータの設定でカラム名を指定すると、指定したカラムの"前"or"後"にカラムをインサートすることができます。

2015年12月3日木曜日

EmbulkのFILTER系プラグインを使ってみた(embulk-filter-column,embulk-filter-row)

こんにちは、井下です。

しばらく触れられていませんでしたが、久しぶりにEmbulkについて書いていきます。
タイトル通り、2つのFILTER系プラグインを使ってみて、どのようにデータをいじれるのかを検証してみます。
なお、検証のために使うデータ・ymlファイルのベースは、Embulkのexampleコマンド⇒guessコマンドによって生成されるデータ・ymlファイルです。


ちなみに以前書いたEmbulkの内容は以下の通りです。

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

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}

なお、デフォルト値は"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 |
+---------+--------------+-------------------------+-------------------------+----------------------------+-------------------------+--------------+

実行結果を見ると、ymlファイル内で定義した通りの値で、"add_time"カラムと"copy_id"カラムが追加されていることが分かります。
※カラム名を分かりやすくするため、previewの実行結果を表示しています。timestamp型のデータにタイムゾーンが表示されているのはそのためです。
 なお、runの場合、"add_time"の値は"2015-12-01 00:00:00.000000 +0000"と表示されていました