UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Embulk】大量のCSVデータをEmbulkを使ってMySQLに投入する

大量のcsvデータに直面した時に、ExcelやNumbersは固まっちゃって開けないし、
ソートとかフィルターとかしたかったので適当なエディタでもダメだし、どうしたものかと悩んでいた

そこでローカルのMySQLにデータを入れるのはどうかなと思い調べてみたら、
Embulkを使うと意外と簡単にできることがわかったのでその作業メモ

前提

  • MySQLはDockerでローカルに用意済み
  • 型とかは適当でいいので、とりあえずローカルのMySQLにデータ投入したい
  • csvのキー数は30項目

embulk

embulkは、さまざまなデータベース、ストレージ、ファイル形式、およびクラウドサービス間のデータ転送をサポートするオープンソースのバルクデータローダー

github.com

pluginが豊富で、今回は以下のpluginを使って実現した
embulk-output-mysql

作業環境

  • Mac
  • DockerForMacはインストール済み

Embulk のインストール

GitHubのREADMEに載ってるまんま実行

$ 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 ~/.bashrc

バージョンを確認

$ embulk --version
embulk 0.9.12

seed.yml から設定ファイルを自動生成する

Embulkはconfig.ymlを元にデータの移行する

このファイルの中で、データ移行元と移行先の両方型定義をしていく
(他にもcsvファイルの場合は文字コード、改行コード、デリミタの設定が必要)

ただ、全くのゼロから記述するのは手間なので、 embulk guess というコマンドを使って、設定ファイル(config.yml)を自動生成する

自動生成するための最低限の情報が記載されたseed.ymlファイルというものを作る

in:
  type: file
  path_prefix: "./target.csv"
out:
  type: stdout

inには読み込むcsvファイル名を書き、outは一旦標準出力にしておく

出力ファイル名にconfig.ymlを指定してembulk guessコマンドを実行

$ embulk guess seed.yml -o config.yml

これでconfig.ymlが生成される

in:
  type: file
  path_prefix: ./target.csv
  parser:
    charset: UTF-8
    newline: LF
    type: csv
    delimiter: ','
    quote: '"'
    escape: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: id, type: long}
    - {name: sub_id, type: long}
    - {name: name, type: string}
    ...
out: {type: stdout}

MySQLへの出力設定

MySQLの出力用のプラグインembulk-output-mysqlをインストールする

$ embulk gem install embulk-output-mysql

config.yamloutmysqlに設定する

out:
  type: mysql
  host: localhost
  user: uggds
  password: password
  database: test_db
  table: test
  mode: replace

modeはEmbulkでデータ投入する度に置き換えるか、追記するかのオプション
今回は置き換えrepalceにする(追記の場合はinsert

実行

$ embulk run config.yml

これだけでMySQLのテーブルやスキーマの作成をEmbulkが自動で作成し、データが投入される