5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?