S-JIS[2015-08-28/2015-10-31] 変更履歴

Embulk YAML

Embulkで使うYAML(ヤムル)のメモ。


概要

Embulkでは、入出力データの定義をYAMLファイル(拡張子yml)で行う。

YAMLはRuby界隈でよく使われている形式のようだ。

とりあえず覚えておくべき重要なことは、インデント(行頭の空白)に意味があるということ。
なので、好き勝手にインデントをずらしてはいけない。
インデントはスペースのみ使用可能(タブ文字は不可)。

YAMLではデータ型がいくつか用意されているようだが、Embulkで使うのは配列とハッシュ・文字列・数値くらいか。

文字列はシングルクォーテーションで囲んでもダブルクォーテーションで囲んでも違いは無いようだ。
クォーテーションで囲む必要も無いようだが、区切り文字(カンマやコロンとか)を含めたい場合は囲む必要がある。[2015-10-31]

「#」は行コメント。


ハッシュは、キーと値の組を指定するもの。
(普通の言語ではマップやディクショナリー(連想配列)と呼ぶところを、Rubyではハッシュと呼ぶらしい)

波括弧で囲む方法 複数行に分けて記述する方法
{key1: value1, key2: value2}
key1: value1
key2: value2

コロン「:」の直後の空白は必須のようだ。[2015-10-31]


行頭にハイフン「-」があるのは、配列(の各要素)。
値のリスト(一覧)を記述するもののようだ。
一行で記載したい場合は角括弧で囲む。[2015-10-31]

角括弧で囲む方法 複数行に分けて記述する方法
[value1, value2]
- value1
- value2

EmbulkのYAMLファイルの構造

EmbulkのYAMLファイル(よくconfig.ymlというファイル名で例が挙げられている)だと、まず、キーが「in」や「out」となっているハッシュを指定する。

config.yml:

in:
  〜
out:
  〜

inやoutの値はさらにハッシュなので、波括弧で囲んだブロックにしてもいいだろうが、数が多いので、複数行に分けて記述しているのだろう。
複数行にする場合は、インデントを増やし、各行のインデント(桁位置)は統一する。

config.yml:

in: {type: file, path_prefix: ./mydata/csv/}
out: {type: stdout}
in:
  type: file
  path_prefix: ./mydata/csv/
out:
  type: stdout

parserのcolumns等は値の一覧を指定するので、配列(ハイフン「-」で始める)になっているようだ。
(columnsの場合、「nameやtypeを指定するハッシュ」の一覧(配列)になる)

config.yml:

in:
  type: file
  path_prefix: ./mydata/csv/
  parser:
    type: csv
    columns:
    - {name: id, type: long}
    - {name: account, type: long}
    - {name: time, type: timestamp}

環境変数の使用

Embulk0.6.22から、RubyのテンプレートエンジンのLiquidが使えるようになった。

YAMLファイル(拡張子yml)を指定する代わりに、Liquidのテンプレートファイル(拡張子liquid)を指定する。

Liquidテンプレートファイルでは、二重の波括弧で囲んだ部分を変数として展開してくれる。
Embulkでは「{{ env.環境変数名 }}」で環境変数を展開することが出来る。

config.yml.liquid

in:
  type: file
  path_prefix: /tmp/data/{{ env.DATE }}/hoge/
  parser:
    type: csv
    columns:
    - {name: text, type: string}
out:
  type: stdout

コマンド:

$ export DATE=20150828
$ embulk run config.yml.liquid

設定ファイルの共有

Embulk0.7.7から、Liquidのinclude構文が使えるようになった。[2015-10-31]
これにより、YAMLファイルを分割して共通の設定ファイルを作り、それを読み込ませるようなことが出来る。

読み込ませる設定ファイルは、ファイル名の先頭をアンダースコア「_」にし、拡張子は「.yml.liquid」にする。
その設定ファイルを読み込む側は、ファイル名全体やパスを指定するのではなくアンダースコアおよび拡張子を除いた名前を指定する。
(なお、名前にハイフンを使うとそのファイルは読み込めない)
(ファイルが読み込めなくても、それ自体はエラーにならない。includeのあった場所がただ単に空文字列になるようだ。その結果、他の構文と整合性が取れなくなると、それはエラーになる)

_mysql.yml.liquid

in:
  type: mysql

config2.yml.liquid

{% include 'mysql' %}
out:
  type: stdout

{% include %}」のある場所がそのまま置換されるので、「{% include %}」の前にインデント(空白)を入れてはいけない。
(上記の例だと、「{% include %}」の前にインデントを入れてしまうと、置換後には「in:」の前にインデントが入った状態になってしまう)

コマンド

$ ls
_mysql.yml.liquid  config2.yml.liquid

$ embulk run config2.yml.liquid

共通の設定ファイルはサブディレクトリー内に置くことも出来る。
その場合、includeには、サブディレクトリー名アンダースコア・拡張子を除いた名前を指定する。

common/_mysql.yml.liquid

in:
  type: mysql

config3.yml.liquid

{% include 'common/mysql' %}
out:
  type: stdout

コマンド

$ ls -R
.:
common  config3.yml.liquid

./common:
_mysql.yml.liquid

$ embulk run config3.yml.liquid

→MySQLの入力出力で設定を共通化した例


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