S-JIS[2015-08-09/2017-07-16] 変更履歴

Embulk ローカルファイルの入力

Embulkのローカルファイル読み込みのメモ。


概要

ローカルファイルはデフォルトで(追加プラグイン無しで)読み込める。

ファイルの形式はパーサーで指定する。
圧縮されているファイルを読み込みたい場合はデコーダーを指定する。

embulkのguessコマンドでローカルファイルを読み込み、レイアウトを推測してymlファイルを生成することが出来る。


csvファイルの例

config.yml:

in:
  type: file
  path_prefix: /tmp/example/master/store_info
  parser:
    type: csv
    charset: UTF-8
    newline: CRLF
    delimiter: ','
    quote: '"'
    escape: '\'
    null_string: 'NULL'
    skip_header_lines: 0
    columns:
    - {name: store_code, type: string}
    - {name: store_name, type: string}
out:
  type: stdout

実行例

$ cat /tmp/example/master/store_info*
123,aaa
456,zzz
789,"a,b c"
890,"a\"b\"c"
999,NULL

$ embulk preview config.yml
〜
+-------------------+-------------------+
| store_code:string | store_name:string |
+-------------------+-------------------+
|               123 |               aaa |
|               456 |               zzz |
|               789 |             a,b c |
|               890 |             a"b"c |
|               999 |                   |
+-------------------+-------------------+

オプション

オプション名 説明 ymlの記述例 デフォルト値
type  
  type: file
(必須)
path_prefix 読み込むファイルのパスの先頭部分。
  path_prefix: /tmp/example/master/store_info
(必須)
decoders ファイルが圧縮されている場合、圧縮形式を指定する。
  decoders:
  - {type: gzip}
 
parser ファイルの形式を定義する。
CSVパーサーのオプション
  parser:
    type: csv
(必須)
last_path ファイルが複数ある(末尾に連番が付いているような)場合、
last_pathで指定されたファイルまではスキップする(読み込まない)。
   

CSVパーサーオプション

csv(あるいはtsv)ファイル用のparserのオプション。

オプション名 説明 ymlの記述例 デフォルト値
type  
    type: csv
(必須)
delimiter データの区切り文字。
    delimiter: ','
','
quote データを囲む文字。
quoteで囲まれている場合、データに改行が含まれていても大丈夫。
    quote: '"'
'"'
escape エスケープ文字。
quoteが「"」でescapeが「\」のとき、「"a\"b"」というデータは「a"b」になる。
    escape: '\'
'\'
skip_header_lines 読み飛ばす行数。
ヘッダー行(1行)をスキップしたい場合は1を指定する。
    skip_header_lines: 1
0
null_string nullを表す文字列。
データがこの文字列と一致した場合、null扱いされる。
    null_string: 'NULL'
 
trim_if_not_quoted trueの場合、quoteされていないデータに対し、空白除去を行う。
    trim_if_not_quoted: true
false
comment_line_marker 行コメントとなる文字列。
行の先頭にこの文字列がある場合、スキップされる。
   comment_line_marker: '#'
 
allow_optional_columns 実際の列数が定義より少ない場合にスキップするかどうか。
trueにするとnull扱いして読み込む。falseだと行全体をスキップする(警告扱い)。
    allow_optional_columns: true
false
allow_extra_columns 実際の列数が定義より多い場合にスキップするかどうか。
trueにすると多い列は無視して読み込む。falseだと行全体をスキップする(警告扱い)。
    allow_extra_columns: true
false
max_quoted_size_limit データがこのサイズ(byte)を超えたら、行全体をスキップする。   131072
default_timezone timestamp項目のデフォルトのタイムゾーン。
columnsで、項目ごとにタイムゾーンを指定することも出来る)
このタイムゾーンとしてデータを読み込み、内部ではUTCで保持する。
    default_timezone: 'Asia/Tokyo'
UTC
newline 行の区切り文字。CRLF, LF, CRのいずれか。
    newline: CRLF
CRLF
charset ファイルのエンコーディング。
    charset: UTF-8
UTF-8
columns 項目定義を行う。
オプション名 説明
name 項目名。必須。
type 項目の属性。必須。
boolean, long, timestamp, double, string
format 日付書式。項目の属性がtimestampの場合に有効。
'%Y-%m-%d %H:%M:%S'といった形式。
timezone タイムゾーン。項目の属性がtimestampの場合に有効。
default_timezone
    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'}
(必須)

timestamp項目について

columnsでtimestampとした項目は、日時(ナノ秒まで)を保持する項目となる。
Embulk内部ではUTCとして保持されるようだ。

したがって、日付のみ(時刻を持たない)の項目として以下のような書式を定義した場合、少し注意を要する。

config.yml:

in:
  type: file
〜
  columns:
  - {name: id, type: long}
  - {name: account, type: long}
  - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S', timezone: 'Asia/Tokyo'}
  - {name: purchase, type: timestamp, format: '%Y%m%d', timezone: 'Asia/Tokyo'}
  - {name: comment, type: string}

実行例

$ $HOME/.embulk/bin/embulk preview sample_csv.yml 
2015-08-09 11:30:44.882 +0900: Embulk v0.6.21
〜
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 10:23:49 UTC | 2015-01-26 15:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 10:01:23 UTC | 2015-01-26 15:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-27 17:20:02 UTC | 2015-01-27 15:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 02:54:36 UTC | 2015-01-28 15:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+

purchaseという項目は「%Y%m%d」という定義なので日付のみのつもりだったかもしれないが、内部では時刻まで保持されている。
(timestamp型は日時を保持するので、当然と言えば当然なのかもしれない)

※previewコマンドでは、timestampの値(Embulkの内部のデータ)がそのまま表示される。
※columnsのformatで指定した日付書式は、csvファイル内の文字列をtimestampに変換する際に使われる(出力用の書式ではない[2017-07-16]


Embulk目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま