search
LoginSignup
1

More than 5 years have passed since last update.

posted at

updated at

DBからCSV形式でデータをエクスポートするとき、Embulkが便利

はじめに

会社でエンジニアをやっていると、データベースからこんなデータをちょうだい!と他の部署から依頼されるケースがあります。データを欲しがるのはだいたい営業やマーケティングの部署なので、エクセルで開くため出力形式はCSVです。
postgresからクエリの結果をCSVへ出力するとき、psqlのCOPY TOを使ったりRailsのActiveRecordなどのORマッパを経由したりするケースが多いと思います。ぼくもずっとそうやってきましたが、あるときふとEmbulkが使えるのでは?と思いつきました。

Embulkは、プラグインでの拡張のしやすさが特徴のバルクローダです。https://github.com/embulk/embulk
自分は、Postgres <=> Mysql間でデータをバッチで同期させたりするのに使っていました。Fluentdの兄弟みたいなもので、Fluentdがストリーミングデータを扱いEmbulkがバルクデータを扱う、というような棲み分けになっています。

下記のようなymlファイルを作って、embulk run config.ymlするだけ。これだけでも毎回psqlコマンドを使うよりはマシな感じになります。

#config.yml

in:
  type: postgresql
  host: your-host
  user: your-user
  password: your-password
  database: your-database
  query: |
    SELECT id AS user_id
    FROM users
    WHERE age > 20
out:
  type: file
  path_prefix: ~/tmp/csv_out
  file_ext: csv
  formatter:
    type: csv
    charset: UTF-16

メリットとしては、

  • yamlファイルとしてクエリがリポジトリに蓄積できる。psqlでやっていると、いちいち前に投げたクエリを覚えておく気にならない。
  • DBの情報とクエリをセットにしておける。
  • 並列実行など、Embulkの便利機能が使える。
  • DBがMySQLに変わったり、他の形式で出力しなければいけないときも怖くない。

あたりでしょうか。

ひとこと

今はクエリを設定ファイルの中に直接書いてしまっているけれど、クエリの定義ファイルを別に作り、実行するときにクエリを柔軟に組み合わせたりなどしてみたいと思っています。

DBからCSVへの出力って、部門間のデータの受け渡しでけっこうやる機会があるけれど、なんとなくpsqlを使っているケースは多いのでは?Embulkを使うのは意外と盲点なんじゃないでしょうか。どこまで実用に耐えるか、しばらく使ってみたいと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1