はじめに
dbtを使ってBigQueryのデータを管理する場合は、大きなテーブルでは incremental updateにすることで、コストを時間的にも経済的にも、下げることができる。
incremental updateのタイプ
- merge: unique_keyを設定することで、新しい値で更新することができるが、すべてのデータをスキャンするので、大きなテーブルには向かない
- insert_overwrite: 対象となるテーブルはpartitionされている必要があるが、対象のpartitionのみを全取り換えすることで、読み込みと書き込みの量を減らせる
- microbatch (beta): (ref)
microbatchはbetaなので今回はまだ読んでいないので、この時点で巨大テーブルのコストを下げるために使うのは insert_overwrite
であることがわかります。
insert_overwriteの設定
以下のように設定できます。
{{ config(
materialized="incremental",
incremental_strategy="insert_overwrite",
partition_by={
"field": "created_date",
"data_type": "timestamp",
"granularity": "day",
"time_ingestion_partitioning": true,
"copy_partitions": true
}
) }}
設定内容:
-
materialized="incremental"
: incrementalを指定することでテーブルが作成されます。 -
incremental_strategy="insert_overwrite"
: strategyを指定します。 -
partition_by
には、partitionの設定を書いていきます-
created_date
でpartitionを行っています -
data_type
で partitionするdata_typeを指定します -
granularity
でday
,hour
などを指定することが出来ます。 -
time_ingestion_partitioning
とすることでingest timeを使ってpartitionすることができます。 (ref: https://cloud.google.com/bigquery/docs/partitioned-tables#ingestion_time) -
"copy_partitions": true
で dynamic partitionの中でも tempのtableを bigquery copy table APIをつかって atomicに入れ替えるので、insertコストがかからず安く、さらに速くなります。
-
結論
dbtで管理する大きなBQテーブルには、以下の設定を!
incremental
insert_overwrite
copy_partitions