こんにちは、negimixです。
ファイルやデータベースなど、各所に散らばっているデータをデータベースに集約して活用したいなぁと漠然と思っていました。
単純にデータを読み込んで、データベースに登録するプログラムを作ればいいんですが、今回はEmbulkを使ってみたので、Embulkの利用方法を紹介したいと思います。
単純にデータを読み込んで、データベースに登録するプログラムを作ればいいんですが、今回はEmbulkを使ってみたので、Embulkの利用方法を紹介したいと思います。
【目次】
Embulkとは
Embulkは、さまざまなストレージ、データベース、NoSQL、クラウドサービス間のデータ転送を支援する並列バルクデータローダーです。
必要に応じてプラグインを利用することで自由に拡張することが可能です。
必要に応じてプラグインを利用することで自由に拡張することが可能です。
Embulk環境構築
環境は以下の状態からはじめました。
https://www.embulk.org/ Embulk公式ページの Quick Start をそのまま実行します。
https://www.embulk.org/ Embulk公式ページの Quick Start をそのまま実行します。
curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar" chmod +x ~/.embulk/bin/embulk echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc source ~/.bashrc0.9.24 がインストールされました。
embulk --version embulk 0.9.24
サンプル実行
Embulkにはサンプルが付属されているので、すぐに動作確認が行えます。
※CSVファイルを読み込み、その結果を画面に出力します。
https://www.embulk.org/
こちらも、Embulk公式ページの Next steps をそのまま実行します。
各コマンドでやっている内容は、概ね以下のとおりです。
2行目:seed.ymlを元にconfig.ymlを生成
seed.ymlの path_prefix のファイルの中身を参照してconfig.ymlを作成してくれます。
■seed.yml
■config.yml
※サンプルではいい感じにconfig.ymlが生成されていますが、実データでは上手く生成されない場合があります。
例) 参照したファイルに列名が無い場合
その際は、config.ymlを直接編集する必要があります。
また、追加で設定が必要な場合もconfig.ymlを直接編集してください。
3行目:config.ymlを使ってプレビュー表示
config.ymlの設定があっているか、プレビューで確認します。
■プレビュー表示
4行目:config.ymlを使って実行
■実行結果
※出力先(out)が stdout になっているので画面に実行結果が出力されます。
※CSVファイルを読み込み、その結果を画面に出力します。
https://www.embulk.org/
こちらも、Embulk公式ページの Next steps をそのまま実行します。
embulk example ./try1
embulk guess ./try1/seed.yml -o config.yml
embulk preview config.yml
embulk run config.yml
各コマンドでやっている内容は、概ね以下のとおりです。
- 1行目:サンプルの展開 ■展開後
tree ./try1 ./try1 ├── csv │ └── sample_01.csv.gz └── seed.yml 1 directory, 2 files
■seed.yml
in: type: file path_prefix: './try1/csv/sample_' out: type: stdout
■config.yml
※サンプルではいい感じにconfig.ymlが生成されていますが、実データでは上手く生成されない場合があります。
例) 参照したファイルに列名が無い場合
その際は、config.ymlを直接編集する必要があります。
また、追加で設定が必要な場合もconfig.ymlを直接編集してください。
in: type: file path_prefix: ./try1/csv/sample_ decoders: - {type: gzip} parser: charset: UTF-8 newline: LF type: csv delimiter: ',' quote: '"' escape: '"' null_string: 'NULL' 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}
■プレビュー表示
+---------+--------------+-------------------------+-------------------------+----------------------------+ | 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 | | +---------+--------------+-------------------------+-------------------------+----------------------------+※Embulk自体のログは省略しています。
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,※Embulk自体のログは省略しています。
データをデータベースに登録
サンプルでは、CSVファイルを読み込み、その結果を画面に出力しました。
ここでは、結果をデータベースに登録したいと思います。
データベースは、普段利用しているPostgreSQLを利用します。
環境は以下のとおりです。
ここでは、結果をデータベースに登録したいと思います。
データベースは、普段利用しているPostgreSQLを利用します。
環境は以下のとおりです。
- PostgreSQL psql (PostgreSQL) 12.9
- EmbulkにpostgreSQL出力用プラグインを導入 プラグインは、 embulk-output-postgresql を使います。
- postgreSQL出力用config.ymlを作成 サンプルで利用したconfig.ymlを利用してpostgreSQL出力用config.ymlを作成します。
- Embulkを実行 ■Embulk実行前(PostgreSQL)
embulk gem install embulk-output-postgresql
ファイル名は、config_postgresql.ymlにしました。
出力先(out)の設定をPostgreSQL用に変更しています。
詳しい設定内容については、embulk-output-postgresqlの README を参照ください。 https://github.com/embulk/embulk-output-jdbc/tree/master/embulk-output-postgresql ■config.yml と config_postgresql.ymlの差分
diff -u config.yml config_postgresql.yml
--- config.yml +++ config_postgresql.yml @@ -15,10 +15,19 @@ skip_header_lines: 1 allow_extra_columns: false allow_optional_columns: false + default_timezone: Asia/Tokyo 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} +out: + type: postgresql + host: localhost + user: postgres + password: {パスワード} + database: embulk + table: embulk_postgresql_sample + default_timezone: Asia/Tokyo + mode: truncate_insert※登録時に、timezoneの違いにより、日時がずれるため default_timezone を追加しています。
embulk=# \d リレーションが見つかりませんでした。 embulk=#■Embulk実行
embulk run config_postgresql.yml■Embulk実行後(PostgreSQL)
テーブルが作成されています。
※事前にテーブルを作成して、データを登録することも可能です。
embulk=# \d リレーション一覧 スキーマ | 名前 | 型 | 所有者 ----------+--------------------------+----------+---------- public | embulk_postgresql_sample | テーブル | postgres (1 行) embulk=#
embulk=# \d embulk_postgresql_sample テーブル"public.embulk_postgresql_sample" 列 | 型 | 照合順序 | Null 値を許容 | デフォルト ----------+--------------------------+----------+---------------+------------ id | bigint | | | account | bigint | | | time | timestamp with time zone | | | purchase | timestamp with time zone | | | comment | text | | | embulk=#データも登録されています。
embulk=# select * from embulk_postgresql_sample; id | account | time | purchase | comment ----+---------+------------------------+------------------------+---------------------------- 1 | 32864 | 2015-01-27 19:23:49+09 | 2015-01-27 00:00:00+09 | embulk 2 | 14824 | 2015-01-27 19:01:23+09 | 2015-01-27 00:00:00+09 | embulk jruby 3 | 27559 | 2015-01-28 02:20:02+09 | 2015-01-28 00:00:00+09 | Embulk "csv" parser plugin 4 | 11270 | 2015-01-29 11:54:36+09 | 2015-01-29 00:00:00+09 | (4 行) embulk=#
まとめ
環境構築からデータベースへの登録を紹介しました。
今回は、プラグインを1つだけ利用しましたが、他にも入出力、フィルタ等のプラグインが用意されています。
https://plugins.embulk.org/
拡張性もあり、大量のデータ処理にも向いているため、今後より活用できる機会を探っていけたらと思います。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com