Posted at

【Embulk】OracleからTSV形式でデータを抜き出す


Embulkを使ってOracleからデータをTSVでダンプする

利用しているOracle(sqlplus)のバージョンによっては、抜き出す機能もありそうなのだが、自分の環境では利用できなかったので、Embulkを利用した。


TSV出力

以下のようなファイルを作成し、環境変数で必要なデータを渡してembulk run exporter.yml.liquidすると、指定のディレクトリ配下(/exporter/{{ env.EXPORT_DATE }})に出力される。


exporter.yml.liquid

in:

type: oracle
driver_path: {{ env.DB_DRIVER_PATH }}
driver_class: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@{{ env.DB_THIN }}
user: {{ env.DB_USER }}
password: {{ env.DB_PASSWORD }}
query: |
SELECT *
FROM {{ env.SCHEMA }}.{{ env.TABLE }}

out:
type: file
path_prefix: /exporter/{{ env.EXPORT_DATE }}/{{ env.TABLE }}-
file_ext: tsv
formatter:
type: csv
delimiter: "\t"
quote_policy: ALL
newline: LF



gzipで出力

gzipで出力する場合は、encodersの設定を入れつつ、拡張子を繋げる。


out:
type: file
path_prefix: /exporter/{{ env.EXPORT_DATE }}/{{ env.TABLE }}-
file_ext: tsv.gz
formatter:
type: csv
delimiter: "\t"
quote_policy: ALL
newline: LF
encoders:
- {type: gzip, level: 6}


出力先をS3に

出力をS3にする場合は、embulk-output-s3プラグインを利用して、以下のように記述する。

out:

type: s3
path_prefix: {{ env.DIR_PATH }}/{{ env.TABLE }}-
file_ext: .tsv.gz
sequence_format: "%03d.%02d"
bucket: 出力先バケット名
endpoint: s3-ap-northeast-1.amazonaws.com
formatter:
type: csv
delimiter: "\t"
quote_policy: ALL
newline: LF
encoders:
- {type: gzip, level: 6}

S3プラグインはfile_extとsequence_formatに設定した値の解釈が、fileプラグインと挙動が違うため、合わせるにはこのようにする必要があった。


失敗談

最初は以下のようにurl側でスキーマを指定し、tableとselectを利用して指定していたが、うまくいかず上記の方法に変更している。

in:

type: jdbc
driver_path: {{ env.DB_DRIVER_PATH }}
driver_class: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:{{ env.SCHEMA }}
user: {{env.DB_USER}}
password: {{env.DB_PASSWORD}}
table: error_message
select: "*"

今思い返すと、自分の環境ではthinをDESCRIPTIONを使って細かく指定しなければいけなかったので、

CONNECT_DATAのINSTANCE_NAMEにスキーマを渡すように書けば、うまくいっていたかもしれない。

そして悪戦苦闘の結果、exporter.yml.liquidではinのtypeをoracleにしているが、使っているのは実質jdbcプラグインの項目なので、jdbcにしても大丈夫なはず。