はじめに
dbtはデータパイプラインを構築するためのとても便利なツールです。
単にSQLを実行してくれるだけでなく、関連する機能がたくさんあります。今回はincrementalモデルとして実行してコストを削減する方法をまとめました。
DWHはBigQueryを利用しています。
実装方法
早速実装方法です。
以下のようなSQLモデルがあったとしたら、
{{
config(
materialized="table",
alias="daily_sales",
partition_by={
"field": "date",
"data_type": "date",
"granularity": "day",
}
)
}}
with
cleansed_orders as (
select *
from {{ ref("int__cleansed_orders") }}
)
select
date(order_time_jst) as date,
sum(sales_jpy) as sales,
count(distinct user_id) as payment_uu,
safe_divide(sum(sales_jpy), count(distinct user_id)) as arppu
from cleansed_orders
group by 1以下のように書き換えます。
{{
config(
materialized="incremental",
incremental_strategy="insert_overwrite",
alias="daily_sales",
partition_by={
"field": "date",
"data_type": "date",
"granularity": "day",
}
)
}}
with
cleansed_orders as (
select *
from {{ ref("int__cleansed_orders") }}
{% if is_incremental() %}
where date(order_time_jst) >= current_date("+9") - 7
{% endif %}
)
select
date(order_time_jst) as date,
sum(sales_jpy) as sales,
count(distinct user_id) as payment_uu,
safe_divide(sum(sales_jpy), count(distinct user_id)) as arppu
from cleansed_orders
group by 1configのmaterializedにincremental、incremental_strategyにinsert_overwriteを指定し、ifブロックでincremental実行時の期間指定を行います。
出力先のテーブルが存在しないときやfull-refreshしたときはifブロック内は実行されず、全データが再構築されます。
テーブルが存在してfull-refreshしていないときはifブロック内が実行され、指定した期間のデータのみが追加されます。
insert_overwrite戦略は、select結果に含まれるパーティション(例ではdate列)を全て上書きします。
例えば5年分処理していたものを7日分だけ処理するようにした変更してクエリコストが1/100以下になった、というようなケースはよくあります。
ちなみにBigQueryのオンデマンド課金ではクエリ実行時にスキャンしたデータ量に応じて課金されるため、where句でフィルタするデータソース側の列がパーティション指定されている必要があります。
incremental_strategyについて
個人的な所感ですが、基本的にはすべてinsert_overwrite戦略を使っていればいいのかなと思っています。一番シンプルで使いやすいです。
merge戦略はBigQueryでは更新するパーティションが全件となるためコスト削減効果が少なくなってしまいます。
比較的新しいmicrobatchは1テーブルをバッチに分けて更新してくれる機能です。
月ごとや年ごとに分けて更新できるため一度に処理できないようなケースで有効です。全件更新する際も、順にバッチを処理していくので巨大なクエリを発行する必要がありません。
参考: 公式のincremental strategyについての記事
https://docs.getdbt.com/docs/build/incremental-strategy
過去の情報を使う場合の注意
例えば、以下のようなケースです。
…
記事の続きは下のURLをクリック!
https://rightcode.co.jp/blogs/54138
エンジニア積極採用中です!
現在、WEBエンジニア、モバイルエンジニア、デザイナー、営業などを積極採用中です!
採用ページはこちら:https://rightcode.co.jp/recruit
社員の声や社風などを知りたい方はこちら:https://rightcode.co.jp/blogs?category=life
フリーランスエンジニア大募集中!
現在、「WEBエンジニア」「フロントエンジニア」「データサイエンティスト」など、様々な職種のフリーランスエンジニア様を募集中です。まずは以下よりお気軽にご応募ください!
採用ページはこちら:https://itanken.com/register
社長と一杯飲みながらお話しませんか?(転職者向け)
特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk
もっとワクワクしたいあなたへ
現在、ライトコードでは「WEBエンジニア」「モバイルエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「営業」などを積極採用中です!
ライトコードは技術力に定評のある受託開発をメインにしているIT企業です。
有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。
- もっと大きなことに挑戦したい!
- エンジニアとしてもっと成長したい!
- モダンな技術に触れたい!
現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?
ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。
- ライトコードの魅力を知っていただきたい!
- 社風や文化なども知っていただきたい!
- 技術に対して熱意のある方に入社していただきたい!
一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。
Wantedly:https://www.wantedly.com/companies/rightcode
コーポレート:https://rightcode.co.jp/