ラベル OSS の投稿を表示しています。 すべての投稿を表示
ラベル OSS の投稿を表示しています。 すべての投稿を表示

2015年6月10日水曜日

embulk-filter-evalでどんなデータ変換ができるのか試してみる

こんにちは、井下です。

少し前のブログで、OSSのEmbulkについて書いてみましたが、MysqlからCsvへの変換という無難な内容だったので、今回はあまり使用例がアップされていないプラグインにフォーカスしてみます。

フォーカスするプラグインは、データの変換をRubyのコードで定義できる"embulk-filter-eval"です。

embulk-filter-evalの概要

embulk-filter-evalは"FILTER"に分類されるプラグインで、"INPUT"でデータを読み込んだ後、"OUTPUT"にデータを渡す前に、データに変換処理を加えられます。
また、出力するカラムを選択できるので、不要なカラムを切り捨てることもできます。

データの転送に際して、ちょっとしたデータの加工をしたい場合や、決まったフォーマットへの変換処理に使えそうですね。

データの変換内容はRubyのコードで定義できるそうですが、具体的にどんなことができるのか、使ってみて分かったことを書いていきます。
なお、出力カラムの選択に関しては、下記の資料を見ればすぐに分かる設定ですので、今回は特に触れません。

インストール方法、ymlファイルの書式、出力カラムの選択方法などは下記のGitHubにアップされている資料をご参照ください。
https://github.com/mgi166/embulk-filter-eval


embulk-filter-evalの利用例

ここから具体的なデータ変換パターンについて、実際に試してみます。
 インプットのデータは"embulk example"で作成されるサンプルデータとし、ymlを編集する都度、"embulk preview config.yml"コマンドでどんな変換がされるのか確認していきます。
※どんな変換が行えるかの確認が目的なので、以降の利用例では計算の中身に深い意味は持たせていません

補足として、変換なしの"embulk preview config.yml"の結果は下記の通りです。
以降、embulk-filter-evalによる変換後の出力との比較として参考にしてください。
+---------+--------------+-------------------------+-------------------------+----------------------------+
| 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 |
+---------+--------------+-------------------------+-------------------------+----------------------------+

数値の計算

GitHubにアップされている資料内にもありますが、手始めに数値計算から。
ymlファイルを次のように書き換えて、再度実行します。

filters: 
  - type: eval 
    eval_columns: 
      - id: value * 2
      - account: value / 3
      - time: value
      - purchase: value
      - comment: value

期待するデータの変換内容は
  • idカラムの値が2倍になる
  • accountカラムの値が3分の1になる

実行結果は次のようになりました。
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       2 |       10,954 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       4 |        4,941 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       6 |        9,186 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       8 |        3,756 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+

idカラムは期待通り2倍になっていますが、accountカラムは3分の1になったうえで小数点以下が切り捨てられてますね。整数同士の除算は整数になるRubyの仕様上、そうなっているのでしょうか。

Rubyの除算の仕様が原因だとすれば、除算している値のどちらかをfloatとして明示すれば、小数点以下も表示されるはずです。
そこで、ymlファイルを次のように書き換えてみます。

filters:
  - type: eval
    eval_columns:
      - id: value * 2
      - account: value / 3.to_f
      - time: value
      - purchase: value
      - comment: value

accountカラムの除算する数値を、floatとして明示しています。

ですが、結果は変わらず小数点が出ないまま…。
その後、色々試してみて分かりましたが、accountカラムの型がlong(整数)である以上、小数点以下は出ないようです。(accountカラムをdoubleにすると、最初のymlファイルでも小数点以下が表示されました)

embulk-filter-evalはデータ変換はするものの、根本的な型を変えたり、制約を越えられないようです。


2015年5月13日水曜日

データ転送のOSS「Embulk」を使って、MysqlからデータをCsvに落としてみる

こんにちは、井下です。

ゴールデンウィーク中はほぼ毎日出かけてましたが、おかげで財布が寒いことになってしまいました。もうクールビズ期間になるくらい、気温は上がっているというのに…。


さて、今回はOSSについて取り上げてみようと思います。
メジャーなOSSだけでも、サーバ監視のZabbix、メールサーバのPostfix、クラウド環境を構築できるOpenStack、A-AUTO 50サイトでも利用しているCMSのWordPressなど今や膨大な数になっています。

新しいOSSも次々とリリースされているので、1年もすればメジャーなOSSの数が倍くらいになっているかもしれません。また、消えていくものもたくさんあるので、OSSの選択は重要ですね。

そこで、今回は新しいOSSに着目し、2015/1/27にリリースされたデータ転送のOSS、Embulk(エンバルク)についての紹介と、実際に利用してみます。


Embulkとは

Embulkとは、先に書いたようにデータ転送のOSSですが、特徴としてデータのインプット・アウトプットや、データの加工をプラグインとして拡張することができます。
既に一般的なDBからのインプット・アウトプットのプラグインや、Amazon S3からのインプット・アウトプとのプラグインが利用できるようになっています。

プラグイン一覧:http://www.embulk.org/plugins/


ご存知の方も多いと思いますが、同様の特徴を持つfluentdというOSSがあります。
Embulkはfluentdのバッチ版として位置づけられ、サーバに常駐してリアルタイムでログを送信するfluentdに対し、Embulkは定期実行や一度だけの実行に利用するものとされています。

例えばDBからcsvファイルとしてデータを落としたいものの、日次で取得できれば十分な場合などに使えそうですね。


とりあえず試してみたい方は下記のテスト実行手順を参考にしてみてください。サンプルデータの作成コマンドが用意されているので、試してみる敷居は低くなっています。
https://github.com/embulk/embulk#trying-the-example


ここからは、実際にDB(より具体的に言うとMysql)から、csvファイルとしてデータを落としてみます。
ちなみに今回はEmbulkの仕組みや、設定に関して詳しい説明はしません。(分かりやすい解説サイトもたくさんありますので…)
Embulkを使ってみて、こんなことができるだなという感じを掴んでもらればいいなと思っています。


実際にやってみる

特徴として挙げたように、Embulkはプラグインによってインプットやアウトプットの幅を広げることができます。
まず、WordPressのDBとして利用されているMySQLからデータを抜き出せるように、"embulk-input-mysql"をインストールします。

[embulk]# embulk gem install embulk-input-mysql
2015-05-11 02:32:29.417 -0400: Embulk v0.6.2
Fetching: embulk-input-mysql-0.4.0.gem (100%)
Successfully installed embulk-input-mysql-0.4.0
1 gem installed

これでEmbulkを使ってMysqlのデータを取り出すことができるようになりました。

次にymlファイルを編集します。
ymlファイルとは、Embulk実行時にインプットにするいわば設計図にあたるファイルで、これによってインプットの種類や内容、同様にアウトプットの種類や内容、データの加工方法について記載します。