Open6

[ETL] なんもわからん

あざらしあざらし

ETL だか Embulk だか

????

なのでメモしたい

やりたいことは、
今のプロジェクトでは全置換なので、それを差分連携にしたい

あざらしあざらし

.yml.liquid の拡張子なに

Liquidというテンプレートエンジンがある
https://shopify.github.io/liquid/

  • Shopify が開発したテンプレート言語
  • ymlファイルに {{ 変数 }}{% if 条件 %}などの記法が使えるようになるので便利だね〜というやつ
  • つまり、Liquidテンプレートを使って動的に生成される Embulk の YAML 設定ファイル ということ
  • 実行前に .yml.liquid → .yml(通常のEmbulk設定)になる感じ

例としては以下なかんじ

query: |
  SELECT * FROM users
  {% if env.LAST_RECORD %}
    WHERE updated_at > '{{ env.LAST_RECORD }}'
  {% endif %}
あざらしあざらし

Embulkの基本構成

in → filters → out の3つの構成

in

データ取得部分(MySQLなど)
Select文とか

たとえば

in:
  type: mysql
  user: {{ env.MYSQL_USER }}
  password: {{ env.MYSQL_PASSWORD }}
  host: {{ env.MYSQL_HOST }}
  port: {{ env.MYSQL_PORT }}
  database: {{ env.MYSQL_DATABASE }}
  query: |
    SELECTほげほげ〜〜〜
  • embulk-input-mysql プラグインを使用して、MySQL からデータを読み取るよ
  • DBのユーザーパスワードほげほげはこの情報を使うよ
  • クエリはこのSelect文だよ

filters

データの整形部分
マスク処理とか

たとえば

filters:
  - type: column
  - type: mask
  - type: script
  • column:列追加・削除・型変換など
  • mask:個人情報などのマスキング
  • script:RubyやJavaScriptによる柔軟な変換処理

out

書き出し部分(BigQueryなど)

たとえば

out:
  type: bigquery
  project: {{ env.BIGQUERY_PROJECT }}
  table: hogehoge
  mode: append
  • embulk-output-bigquery プラグインを使って、BigQuery にデータを書き出すよ
  • BigQueryのこのプロジェクトのhogehogeテーブルにコピーするよ
  • appendモード(追記)でコピーするよ

みたいなこと

mode

BigQueryの書き出しの mode についていくつか種類がある

  • append:追記モード(デフォルト)
  • replace:全削除→全コピーモード

が基本

そのため、
Updateしたいとき、全置換もしくは追記される
つまり、単純に実装しようとするとデータの重複が起きる

あざらしあざらし

じゃあ差分更新どうやってやるねん

ChatGPTにきいたらmergeモードあるでって言われたけどねええええええええええええええええやんけえええええええうおおおおおおおんんんんんんんん;;;;;;;;;;;;;;;

BigQueryにTEMPテーブルにデータが入った後に、なにかしらUNIONなどで結合してからホンチャンのテーブルに入れる必要がある

以下なかんじ?
https://www.yasuhisay.info/entry/2021/05/31/083000


こうすることにした

  • MySQL:コピー元
  • BigQuery:コピー先
  1. バッチ的なもので、BigQuery の最終更新日(update_date 的な)を取得する
  2. Embulk を実行。「1.」で取得した日付以降の更新データを MySQL から取得し、一時テーブルにコピー
  3. バッチに戻って「3.」の一時テーブルと大元のテーブルをUNION、結果を大元のテーブルに書き換える