Open6
[ETL] なんもわからん

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

ETL
- データの抽出(Extract)
- 変換(Transform)
- 書き出し(Load)
を行う
これによって、たとえばMySQLなどのRDBMSからBigQueryみたいなDWHにまとめることができる

Embulk
- オープンソースのETLツール
- コマンドライン上で動作する
- yaml形式で記述することで転送が可能

.yml.liquid
の拡張子なに
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などで結合してからホンチャンのテーブルに入れる必要がある
以下なかんじ?
こうすることにした
- MySQL:コピー元
- BigQuery:コピー先
- バッチ的なもので、BigQuery の最終更新日(update_date 的な)を取得する
- Embulk を実行。「1.」で取得した日付以降の更新データを MySQL から取得し、一時テーブルにコピー
- バッチに戻って「3.」の一時テーブルと大元のテーブルをUNION、結果を大元のテーブルに書き換える