🛤️
TROCCOで月単位に分割してデータの洗い替えを行う
はじめに
大容量テーブルを移行する場合、一度に全件を取り込むと時間やリソースが過剰に必要になります。そこで、月ごとに分割して取り込みを行う手順をまとめます。
環境
MySQL → BigQueryを想定して書いています。
1. 取り込み先テーブルを初期化
データマート定義作成: まず、BigQuery 側で既存データを削除します。
TRUNCATE TABLE `取り込み先のテーブル`
2. 月単位でデータ転送を設定
転送設定作成: 月単位で分割して取り込む設定を指定
- カスタム変数:
$date$ [ 時刻・日付 (キューイング時): 0日前, %Y%m, Etc/UTC]
- 転送方法: クエリを使用して転送
- クエリ
SELECT * FROM `取り込み先のテーブル` WHERE DATE_FORMAT(created_at, '%Y%m') = '$date$'
- タイムゾーン: UTC
- 転送先の転送モード: 追記 (APPEND)
ワークフロー作成:
先ほどのデータマート定義と転送設定を使ってワークフローを作成します。
カスタム変数でループ実行を設定:
ワークフローのフロー編集、タスク編集からカスタム変数でループ実行
を設定
- カスタム変数でループ実行: ✅
- ループの種類: Google BigQueryのクエリ結果でループ
- 対象カスタム変数:
$date$ (転送元MySQL)
- クエリ
※ 事前に取り込み元のテーブルで一番古い日付を取得仮に実行すると結果は下記になるSELECT FORMAT_DATE('%Y%m', day) AS month FROM UNNEST(GENERATE_DATE_ARRAY('2024-06-01', CURRENT_DATE("Asia/Tokyo"), INTERVAL 1 MONTH)) AS day ORDER BY 1 -- select min(created_at) from `取り込み元のテーブル` -- 2024-06-19 01:00:00のため2024年6月から
おわりに
この設定により、大きなテーブルでも月単位で分割して安全に洗い替えを行うことが可能です。処理負荷を抑えながら確実にデータを移行したい場合に有効な方法です。
参考
Discussion