🐊

troccoとBigQueryで冪等性を考慮し日次バッチ処理をする

2022/02/27に公開

概要

  • BigQueryを使用している
  • APIから前日に更新されたデータを取得したい
  • troccoで日次で転送を行うがデータが入らないケースがある
  • リトライした際に重複データが出るとまずいので、冪等性を考慮した設計にしたい
  • パーティション分割テーブルとデコレータを付与することで実現した

BigQueryのパーティション分割テーブルとは

パーティションと呼ばれるセグメントに分割された特殊なテーブルで、パーティショニングされた値に対してフィルタを使用すると一致する部分のみスキャンすることができる。コスト削減、クエリのパフォーマンスアップにつながるので良い。

https://cloud.google.com/bigquery/docs/partitioned-tables?hl=ja

パーティションテーブルを扱う方法は2つ。

  • table名でパーティションデコレータを指定
  • time_partitioning.fieldを指定

指定パーティションのみreplaceしたい場合はパーティションデコレータを用いる必要がある。
データ重複は避けたいが、全データを読み込むのが難しいケースに重宝しそう。

参考にさせていただいたパパエンジニアさんのブログ

パーティションデコレータとは

クエリ結果を特定のパーティションに書き込める。ただ書き込まれるデータの全ての行はパーティションの日付内に収まる必要があるので注意。($20220227とデコレータをつけているのに、パーティション値にそれ以外の日付が入ってはいけない)

https://cloud.google.com/bigquery/docs/creating-column-partitions?hl=ja

パーティションデコレータを用いてtroccoの転送設定を行う

例としてgoogle search consoleのAPIを叩く。

取得期間を変数機能で設定。

BigQueryの転送先テーブルも先程と同様の日付を変数で設定。

テーブル名が「test$yyyymmdd」となるように調整。

冪等性を考慮するため、転送モードは全件洗い変え(REPLACE)にする。(同じ日付のデータを上書きして重複を避ける)

おわりに

データが入ってこなかった場合は後日リトライする部分まで自動化したい。
気になる点があればご指摘くださいm(__)m

既に公式のヘルプ記事があったことに途中で気がついたorz
https://docs.trocco.io/s/article/転送先BigQueryにて-特定のパーティションテーブルのデータを置換する方法?language=ja

Discussion