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ファイル(よくconfig.ymlというファイル名で例が挙げられている)だと、まず、キーが「in」や「out」となっているハッシュを指定する。
in: 〜 out: 〜
inやoutの値はさらにハッシュなので、波括弧で囲んだブロックにしてもいいだろうが、数が多いので、複数行に分けて記述しているのだろう。
複数行にする場合は、インデントを増やし、各行のインデント(桁位置)は統一する。
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を指定するハッシュ」の一覧(配列)になる)
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.環境変数名 }}
」で環境変数を展開することが出来る。
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のあった場所がただ単に空文字列になるようだ。その結果、他の構文と整合性が取れなくなると、それはエラーになる)
in: type: mysql
{% include 'mysql' %} out: type: stdout
「{% include %}
」のある場所がそのまま置換されるので、「{% include %}
」の前にインデント(空白)を入れてはいけない。
(上記の例だと、「{% include %}
」の前にインデントを入れてしまうと、置換後には「in:
」の前にインデントが入った状態になってしまう)
$ ls _mysql.yml.liquid config2.yml.liquid $ embulk run config2.yml.liquid
共通の設定ファイルはサブディレクトリー内に置くことも出来る。
その場合、includeには、サブディレクトリー名とアンダースコア・拡張子を除いた名前を指定する。
in: type: mysql
{% include 'common/mysql' %} out: type: stdout
$ ls -R .: common config3.yml.liquid ./common: _mysql.yml.liquid $ embulk run config3.yml.liquid