S-JIS[2015-08-08]

Embulk example

Embulkのexampleのメモ。


概要

Embulkでデータ転送を行う為には、転送元データ・転送先を定義ファイルに記述する必要がある。
定義ファイルはYAML(ヤムル)という形式のファイルで、拡張子はyml。

$ embulk run hoge.yml

この定義ファイルには、ファイルの場合はパス、RDBの場合は接続情報やテーブル等を記述する。
また、データのレイアウト(レコード定義、テーブルレイアウトといったもの)も記述する。


Embulkでは、実際のファイルを指定すると、それを読み込んでデータ定義を推測して定義ファイルを生成してくれる機能がある。

$ embulk guess tmp.yml -o hoge.yml	…tmp.ymlに書かれたファイルを読み込み、hoge.ymlを生成する

(guessコマンドで読み込みたい入力データも、guess用のymlファイルを作って指定する)

もちろん、guessコマンドを使わずに、自分で定義ファイルを全て記述してもよい。
というか、日次バッチ等の定型処理としてEmbulkを使うなら、事前に定義ファイルを作成しておくことになるだろう。
(SIerならファイルレイアウトやテーブルレイアウトをExcelで管理しているだろうから、そこからymlファイルを生成すればいい)


Embulkのコマンドには、初心者が初めて試すためのサンプルデータおよび定義ファイルを生成する機能がある。
embulkのexampleコマンドを実行すると、それらが生成される。
それらを使って、guessコマンドやrunコマンドを実行することが出来る。


exampleの例

embulkのexampleコマンドを使ってサンプルデータを生成し、それを転送する為の定義ファイルを作ってデータ転送してみる。


exampleコマンド

最初に、サンプルデータおよび最初の定義ファイルを生成する。

embulkコマンドの引数として「example」を指定し、その後ろにサンプルデータ類を生成する場所(ディレクトリー)を指定する。

$ embulk example /tmp/hoge

これを実行すると、以下のようなディレクトリーおよびファイルが作られる。

csvディレクトリーにあるのが入力データとなるファイル。

example.ymlの中はこんな感じ。(このファイルは、guessコマンドの入力として使用する)

$ cd /tmp/hoge
$ cat example.yml
in:
  type: file
  path_prefix: "/tmp/hoge/csv/sample_"
out:
  type: stdout

入力ファイル(のファイル名の先頭部分)が「/tmp/hoge/csv/sample_」。
出力先は標準出力(コンソール)。


guessコマンド

Embulkには、実際のファイルを読み込んでファイルレイアウトを推測し、定義ファイルを生成する機能がある。
embulkのguessコマンドを使用する。

guessコマンドでも、読み込むファイルを指定するのにymlファイルを使う。
サンプルの場合は、example.ymlというファイルがそれ。

$ cd /tmp/hoge
$ embulk guess example.yml -o sample_csv.yml

embulk guess example.yml」だけで実行すると、推測した結果がコンソールに表示される。
「-o」オプションを付けると、コンソールだけでなく指定したファイルにも出力される。

$ cat sample_csv.yml
in:
  type: file
  path_prefix: /tmp/hoge/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}
out: {type: stdout}

このsample_csv.ymlをrunコマンド(やpreviewコマンド)に指定することで、実際のデータ転送を行う。


previewコマンド

実際のデータ転送を行わず、試しに入力データを読み込んでみる(dry-runする)のがpreviewコマンドの役割。
読み込んだデータは(表形式っぽい感じで)コンソールに表示される。

$ cd /tmp/hoge
$ embulk preview sample_csv.yml
2015-08-08 18:31:49.287 +0900: Embulk v0.6.21
2015-08-08 18:31:50.252 +0900 [INFO] (preview): Listing local files at directory '/tmp/hoge/csv' filtering filename by prefix 'sample_'
2015-08-08 18:31:50.258 +0900 [INFO] (preview): Loading files [/tmp/hoge/csv/sample_01.csv.gz]
+---------+--------------+-------------------------+-------------------------+----------------------------+
| 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 |
+---------+--------------+-------------------------+-------------------------+----------------------------+

runコマンド

実際のデータ転送を行うのがrunコマンド。

$ cd /tmp/hoge
$ embulk run sample_csv.yml
2015-08-08 18:32:10.685 +0900: Embulk v0.6.21
〜
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
〜

sample_csv.ymlの中で出力先が標準出力(コンソール)になっているので、コンソールに表示されている。


sample_csv.ymlのoutをファイルに変えてやれば、ファイルに出力される。

sample_csv.yml

〜
out:
  type: file
  path_prefix: /tmp/hoge/output/sample_
  file_ext: csv
  formatter:
    type: csv
    header_line: false
$ mkdir -p /tmp/hoge/output		…出力先のディレクトリーは事前に存在している必要がある

$ embulk run sample_csv.yml
2015-08-08 18:46:08.295 +0900: Embulk v0.6.21
〜

$ ls /tmp/hoge/output/
sample_000.00.csv

$ cat /tmp/hoge/output/sample_000.00.csv 
1,32864,2015-01-27 19:23:49.000000 +0000,2015-01-27 00:00:00.000000 +0000,embulk
2,14824,2015-01-27 19:01:23.000000 +0000,2015-01-27 00:00:00.000000 +0000,embulk jruby
3,27559,2015-01-28 02:20:02.000000 +0000,2015-01-28 00:00:00.000000 +0000,"Embulk ""csv"" parser plugin"
4,11270,2015-01-29 11:54:36.000000 +0000,2015-01-29 00:00:00.000000 +0000,NULL

実際に出力されるファイル名には000.00のような数字が付く。
(ymlファイルに指定するパスは「path_prefix」(接頭辞)、つまりファイル名の先頭部分だけを指定しており、末尾にはEmbulkが自由にIDを付けるのだろう(分割してデータ転送すれば、IDが異なる複数のファイルが作られると思う))


Embulk目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま