Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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にしても大丈夫なはず。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした