[Embulk]columnプラグインを使い任意のカラムを取得する/カラムを並び替える

2016.04.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Embulkを使用し、CSVファイルから任意のカラムを選択し、カラムの並び順を変えて出力することをやってみました。その手順について、まとめてみたいと思います。

使用するプラグインについて

Embulkはインストール済みであるものとします。フィルタープラグインの一つであるcolumnプラグインを使用します。以下のコマンドでインストールをします。

$ java -jar embulk.jar gem install embulk-filter-column

カラムの取得、並び替え

取得元となるCSVについて

EmbulkにはサンプルのCSVを作成する機能があります。以下のコマンドでサンプルのCSVを作成します。

java -jar embulk.jar example ./mydata

実行すると「mydata/csv」フォルダ内に「sample_01.csv.gz」という圧縮したサンプルが作成されます。解凍すると以下の様なCSVとなっています。これは今回、取得元となるCSVファイルです(厳密には圧縮ファイルを取得元とします)。

id,account,time,purchase,comment
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,NULL

カラムの選択、並び替えについて

カラムの選択、並び替えについては、Embulkが使用するプラグインを記載するyamlファイルに記述します。今回は「config.yml」という名前でyamlファイルを作成し、フィルターとしてcolumnプラグインを指定します。

config.yml(フィルターのみ)
(中略)
filters:
  - type: column
    columns:
      - {name: time, format: "%Y-%m-%d %H:%M:%S"}
      - {name: id, type: long}
      - {name: comment, type: string}
      - {name: account, type: long}
(中略)

フィルターの定義のみを抜粋しました。フィルターの種類として「column」を指定しています(3行目)。そして「columns」要素に取得するカラム名を、任意の並び順で記述します。今回の例では、purchaseカラム以外のカラムをtime・id・comment・accountの並び順で取得しています。

config.ymlにはフィルター以外にも取得元となるファイル名、出力形式などを記述する必要があります。今回作成したものの全体は以下のようになります。

config.yml(全体)
in:
  type: file
  path_prefix: ./mydata/csv/sample_01.csv.gz
  decoders:
  - {type: gzip}
  parser:
    charset: Shift-JIS
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: '"'
    skip_header_lines: 1
    columns:
    - {name: id, type: long}
    - {name: account, type: long}
    - {name: time, type: string}
    - {name: purchase, type: string}
    - {name: comment, type: string}
exec: {}
filters:
  - type: column
    columns:
      - {name: time, format: "%Y-%m-%d %H:%M:%S"}
      - {name: id, type: long}
      - {name: comment, type: string}
      - {name: account, type: long}
out:
  type: file
  path_prefix: ./mydata/csv/sample_01
  file_ext: csv
  formatter:
    type: csv
    header_line: true
    delimiter: ","
    quote: '"'
    escape: '\'
    newline: CRLF
    charset: UTF-8

全項目の詳細な説明はここでは避けますが、エスケープ文字の指定について取得元はダブルクォート(")を指定してし(12行目)、出力先はバックスラッシュ(\)で指定している(37行目)のに注意してください。

取得の実行

以下のコマンドでEmbulkを起動します。

$ java -jar embulk.jar run config.yml

実行すると以下の様なCSVが出力されます。

time,id,comment,account
2015-01-27 19:23:49,1,embulk,32864
2015-01-27 19:01:23,2,embulk jruby,14824
2015-01-28 02:20:02,3,"Embulk \"csv\" parser plugin",27559
2015-01-29 11:54:36,4,NULL,11270

config.ymlで指定した通りのカラム、並び順で出力されていることが分かるかと思います。またエスケープ文字についても、指定した文字に変換されて出力されていることが分かるかと思います。

最後に

今回は紹介しませんでしたが、columnプラグインの説明によるとカラムの追加などもできるようです。カラムの並び替え、追加、削除などが必要な場合はこのプラグインの使用を検討してもいいかもしれません。

参考サイト

embulk-filter-column