見出し画像

Treasure Dataでリカバリしやすい月次バッチを仕込みたい

前提)月次バッチ処理にて、RAWデータから対象データの集計を行いサマリデータを生成したい。


方法1.  対象期間データをINSERTでテーブルに格納する

画像1

メリット:シンプル
デメリット:月次データに不具合があった場合に、当該データを削除してからリランしなければならない

DELETE FROM <table> WHERE TD_TIME_RANGE(time, <処理日>, null, 'JST')

方法2. 対象期間(YYYYMM)毎にテーブルを作成し格納する

画像2

メリット:リランする際に前処理が不要。削除対象レコード確認、削除後レコード確認が不要。
デメリット:月別テーブルが増え、月次処理結果をマージしたい場合にUNIONしなければいけない

DROP TABLE IF EXISTS <table_YYYYMM>;
CREATE TABLE <table_YYYYMM> AS
SELECT ....

今回ご紹介するのは、方法2でTreasure WorkFlowを使用し、自動でマージ処理を行う方法を記載いたします。

実現したいことはこのようなイメージ

画像4

WorkFlow記述サンプル(※方法2の処理実行完了まで省略)
1. サマリデータ格納用テーブルを初期化
2. SHOW TABLESを使用し、インポート対象テーブル一覧を取得
3. 2で取得したテーブル分LOOP処理
4. 対象テーブルのデータをサマリデータ格納用テーブルにINSERT
+create_all_summary_table:
  td_ddl>:
  empty_tables: ["table_all_summary"]

+for_each_tables:
  td_for_each>: queries/tables.sql
  _do:
    td>: queries/insert_all_summary.sql

queries/tables.sql

SHOW TABLES FROM [ FROM schema ] LIKE 'table_%'

queries/insert_all_summary.sql

INSERT INTO table_all_summary
SELECT * FROM ${td.each.Table}

あとがき

如何でしょうか?この方式の場合、方法1と比較し、月別過去分データの処理をINSERTするため処理時間は大幅に増加してしまいますが、月次集計データ等少量データにおいては、リカバリ作業量や確認に要する時間を大幅に軽減できると考えております。
 また、処理対象月をTD_SCHEDULED_TIME()を使用することにより、過去特定月の処理のみ再集計を行い、リカバリすることが容易になるため、メンテナンスコストにおいてもメリットがあると思います。

皆様、他に良い案がございましたら、教えていただけますと幸いです。


いいなと思ったら応援しよう!