🛤️

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月から
    
    仮に実行すると結果は下記になる

おわりに

この設定により、大きなテーブルでも月単位で分割して安全に洗い替えを行うことが可能です。処理負荷を抑えながら確実にデータを移行したい場合に有効な方法です。

参考

https://documents.trocco.io/docs/ja/data-destination-bigquery#転送モードについて

Discussion