Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
2年運用した dbt プロジェクトを リファクタリングする
Search
Recruit
PRO
March 29, 2023
Business
3
1.7k
2年運用した dbt プロジェクトを リファクタリングする
2023/03/28、dbt Meetup dbt ユーザー会で発表した、森田の資料になります。
Recruit
PRO
March 29, 2023
Tweet
Share
More Decks by Recruit
See All by Recruit
スタサプ ForSCHOOLアプリのシンプルな設計
recruitengineers
PRO
3
900
リクルート流データ基盤塾~鶴谷と学ぶ~
recruitengineers
PRO
5
130
『SUUMO』 スマホサイト デザインリニューアルへの挑戦
recruitengineers
PRO
5
270
『リクルートダイレクトスカウト』 のリニューアルから振り返る: ビジョンドリブンの可能性
recruitengineers
PRO
3
270
負債あるモノリスのオブザーバビリティに組織で向き合う
recruitengineers
PRO
9
380
あなたの知らないiOS開発の世界
recruitengineers
PRO
4
310
大規模プロダクトにおける組織作りと技術ポートフォリオマネジメント
recruitengineers
PRO
4
440
OR学会2024秋_短期収益と将来のオフ方策評価性能を考慮したクーポン割当方策混合比の決定
recruitengineers
PRO
5
660
リクルート新人研修2024 テキスト生成AI活用
recruitengineers
PRO
12
990
Other Decks in Business
See All in Business
俺とStripe -業務用自動車レンタルサービス BNR-
pharaohkj
2
220
サスメド株式会社 Culture Deck
susmed
0
36k
プロダクトの大事なこと全部書く 〜わかりあいのワークショップ〜
watasuke
0
260
PROLE株式会社 COMPANY DECK
prole
PRO
0
800
Clarity for Product People
arnekittler
0
650
ログラス会社紹介資料 新卒採用 ビジネス職[経営幹部候補]/ Loglass Company Deck
loglass2019
0
140
株式会社スタメン プロダクト職種向け会社紹介資料 / for-Product
stmn
0
1.3k
メタバースを活用した東京の魅力発信
tokyo_metropolitan_gov_digital_hr
1
420
データガバナンスチームの結成で得た学び / Insights from the Data Governance Team
auto_yak_ant
0
830
TOKYOスマート・カルチャー・プロジェクト
tokyo_metropolitan_gov_digital_hr
0
440
enechain company deck
enechain
PRO
7
89k
マイナンバーを活用した申請手続の簡素化
tokyo_metropolitan_gov_digital_hr
2
400
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
1
39
RailsConf 2023
tenderlove
29
880
Code Review Best Practice
trishagee
64
17k
The Power of CSS Pseudo Elements
geoffreycrofte
72
5.3k
Building Adaptive Systems
keathley
38
2.2k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
355
29k
What's in a price? How to price your products and services
michaelherold
243
12k
Teambox: Starting and Learning
jrom
132
8.7k
Become a Pro
speakerdeck
PRO
24
5k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Faster Mobile Websites
deanohume
304
30k
Statistics for Hackers
jakevdp
796
220k
Transcript
© Recruit Co., Ltd. All Rights Reserved 2年運用した dbt プロジェクトを
リファクタリングする 株式会社リクルート データ推進室 D3M 部 森田 順也 2023/03/28
© Recruit Co., Ltd. All Rights Reserved 自己紹介 森田 順也
(もりた じゅんや) @jjjjj_kn データ推進室 データテクノロジーユニット D3M 部 アナリティクスエン ジニア SIerにてデータ異常検知の研究開発に携わった後、2019年にリクルー トへ入社。アナリティクスエンジニアとして分析基盤の開発に従事。 data saber。 Podcast https://open.spotify.com/show/6Xc6jNS2p1UqjnPppwO80V?si=WXCP2O58RrePvsjTMomtIw Zenn https://zenn.dev/mjunya1030 2 #recruitdata
© Recruit Co., Ltd. All Rights Reserved 本日お話しすること カーセンサーでは、2020年にdbtの検証を始め、導入して2年以上が経っていま す。長期間運用する中で、分析のスピードをとにかく早めるため試行錯誤を重ね
てきました。 本日はこの試行錯誤の一つである、リファクタリングの推進を深ぼってお伝 えしたいと思います。 3
© Recruit Co., Ltd. All Rights Reserved 4 ご存知でしょうか カーセンサー
実は、単なる中古車情報サイト ではないんです
© Recruit Co., Ltd. All Rights Reserved CASE: 自動車業界は100年に一度の大変革時台 5
Connected Autonomous Shared & Services Electrification コネクティッド 自動化 シェアリング 電動化
© Recruit Co., Ltd. All Rights Reserved クルマの利用シーンを包括的に支援するプラットフォームへ 6 新車
買いたい 中古車 買いたい 新車 リースしたい 中古車 リースしたい 借りたい カスタマー クライアント Mission クライアントの商いを拡げ、 それによって、 ユーザーの選択肢を拡げる。
© Recruit Co., Ltd. All Rights Reserved 私たちのMission: あらゆる業務をデータで牽引すること 7
カーディーラー様に 売れ筋の車種を提案したい! 新規事業で追うべき KPIを 見つけたい! 集客の効果・コストを モニタリングしたい! 営業 企画 マーケティング 提案にそのまま持っていける BIツールを提供 さまざまな軸でドリルダウンでき るデータソースを提供 数値定義を統一した KPIダッシュボードを提供 さまざまな分析ニーズに対応する必要がある
© Recruit Co., Ltd. All Rights Reserved リファクタリングが必要になった経緯 8
© Recruit Co., Ltd. All Rights Reserved 分析サイクルのスピードはビジネスによってさまざま 9 分析サイクル
課題設定→ログ設計→データ収集→分析→行動... ref. adobe SLOW: 集客効果のモニタリング 月次、年次で統一されたKPIを定常的に振 り返る FAST: 新機能の初速分析 毎週のように課題発見、打ち手実施を行 い、NorthStar となる指標を変えながら 振り返る サイクルの早い分析に どう対応するか?
© Recruit Co., Ltd. All Rights Reserved adhoc レイヤーの導入 10
生成されるモデルが全て view であり、更新jobが不要 で、モデリングルールを無視でき、 通常の開発フローから切り出してリリースできるレイヤー Source Staging Mart Reporting Adhoc
© Recruit Co., Ltd. All Rights Reserved 開発着手 Pull Requrest
Main Merge Tag adhoc レイヤーの導入 11 生成されるモデルが全て view であり、更新jobが不要 で、モデリングルールを無視でき、 通常の開発フローから切り出してリリースできるレイヤー non-adhoc adhoc dbt SQL設計・実装 dbt SQL設計・実装 dbt JOB設計・実装 開発環境デプロイ 開発環境デプロイ 開発JOBの実行・テーブル生成 開発デプロイ前レビュー 本番デプロイ前レビュー 開発環境データテスト 開発環境データテスト 本番デプロイ前レビュー 本番環境デプロイ 本番環境デプロイ 本番JOBの実行・テーブル生成 本番環境データテスト /Doc生成 本番環境データテスト /Doc生成 開発フロー • テスト • ドキュメンテーション • レビュー 上記全て行いつつ リリースまでの工程を短縮 保守性を犠牲に スピードを獲得
© Recruit Co., Ltd. All Rights Reserved adhoc レイヤーのクエリはリファクタリング前提 12
dbtを使ったクエリのリファクタリングについてご紹介します 本日のメインテーマ!
© Recruit Co., Ltd. All Rights Reserved データパイプライン開発の リファクタリングとは何か 13
© Recruit Co., Ltd. All Rights Reserved You Ain’t Gonna
Need It 14 「こんなこともあろうかと」と思って作ったテーブ ルは大抵使われない。 先に仕様を満たすテーブルをリリースし、後から保守 しやすい形に変えるほうが価値を最大化できる。 Source Staging Mart Adhoc Adhoc Adhoc Source Staging Mart reporti ng reporti ng reporti ng Source Adhoc Adhoc Adhoc Source Staging Mart 保守しやすい形とは?
© Recruit Co., Ltd. All Rights Reserved 保守しやすいデータパイプラインは永遠のテーマ 15 パイプライン開発の課題を解く方法はたくさんある
都度設計について議論・設計していてはリファクタリングが進まない UU数算出の計算が 多数のクエリで登場している 思わぬところでBIツールや Jobから参照されている 加工・結合が乱立していて処 理を読み解きにくい データパイプラインにもデザインパターンが欲しい テーブルを分ける? クエリにコメントを書く? マクロでまとめる? 中間テーブルにする? 不用意な参照を禁止? リネージをメタ情報に記載?
© Recruit Co., Ltd. All Rights Reserved モデリング:データパイプライン開発のデザインパターン 16 Source
Staging Mart Reporting データパイプラインのリファクタリングとは、 モデリングのルールを作り、クエリをルールに寄せていくこと Source Adhoc 一次加工的 な処理 複数のCTEの 結合処理 BIレポート用に 集計する処理
© Recruit Co., Ltd. All Rights Reserved カーセンサーで導入したモデリングのルール 17 Source
Staging Mart Reporting 1要件:1テーブルとし、 要件外から参照させない ユーザーごとの粒度に 揃え、ユーザーに関する 分析はこのテーブルを 必ず使う 元のデータの単純変換 のみとし、Join等を行 わない。 参照先テーブルを限定さ せて不具合時の影響範囲 を絞る SSoTとして機能させ、 指標の定義ズレをなく す 1次加工とドメインに依 存するロジックを分離 し、見通しをよくする ルール 目的 事例紹介 このルールに寄せれば “ある程度” リファクタリング可能
© Recruit Co., Ltd. All Rights Reserved “良い” リファクタリングとは 18
© Recruit Co., Ltd. All Rights Reserved 不吉な匂いから課題を見つける 19 解決したい課題を言語化し、既存のモデリングルールを適用して課題が解けそうか確認し、解けなければ
ルール自体を見直す。 不吉な匂い 500行を超えるような長大なクエリがあ る 全く同じ加工処理がある(CASE文、 CAST等) 粒度が同じテーブルがある 特定の用途で作られたテーブルが、意図し ないテーブルから参照されている 課題 クエリを保守できる人が限定されてしまい改 修が進みにくくなっていないか? ロジック変更時に修正する箇所が多く、抜け漏 れを起こしていないか? どちらのテーブルを参照すべきか判断がつか なくなっていないか? テーブルを修正したら思わぬ場所に影響が出 てしまいデグレを起こしていないか?
© Recruit Co., Ltd. All Rights Reserved ドメイン知識を貯める 20 分析時のコンテキスト=ドメイン知識に応じて最適なモデリングは変わる
売上など財務に関する分 析が多い 営業組織単位で分析する ことが多い 売り上げは顧客毎に計上している 営業組織は顧客毎に組閣している 顧客で一意になるテーブルがあれば、両方の分析ニーズを満たすことができる 経営企画室 営業部 リファクタリング案 分析の傾向 ドメイン知識
© Recruit Co., Ltd. All Rights Reserved ドメイン知識をディメンショナルモデリングに応用 21 ファクト=粒度を導出する
ディメンション=属性を導出する 事例紹介 年月と車台番号の粒度でデータを持 たせておく 複数の属性から導けるボディタイプ という属性を作っておき、不要な属 性を減らす カーディーラー様が、カーセンサーの 掲載効果を月次でチェックしている 車は、ボディタイプによって人気や売 れる地域が大きく変わる 年月と車台番号に関する分析が多い ボディタイプでフィルタする分析が多い 分析の傾向 ドメイン知識 リファクタリング案
© Recruit Co., Ltd. All Rights Reserved リファクタリングをやり切るには 22
© Recruit Co., Ltd. All Rights Reserved 振る舞いを変えず、内部処理を変える 23 Source
@prd Adhoc Staging Mart Adhoc リファクタリング前 リファクタリング後 Source 振る舞い 最終的なテーブルのデータ が変わってない 内部処理 中間テーブルが 増えている 振る舞いを定義して、テストすることがゴール
© Recruit Co., Ltd. All Rights Reserved 外部に公開・提供しているテーブルを振る舞いとする 24 Source
Staging Mart adhoc Reporting Ephemeral 営業部 UI/UXチーム 経営企画室 振る舞い 内部処理 ※レイヤーと 内部処理/振る舞い がある程度対応するモデリングルールのほうが扱いやすいことが多い
© Recruit Co., Ltd. All Rights Reserved Exposureを用いて振る舞いとなるテーブルを管理 25 事例紹介
© Recruit Co., Ltd. All Rights Reserved 振る舞いをテストする 26 テーブルの一意性が崩れていないかに加え、変更前後で完全合致するかを確認する
スキーマテスト リファクタリング前後で、テーブルの一意性・参 照整合性が変わってないことをテストする。 - unique 結合処理を書き換えるとレコードの重複が起 こりやすいため、uniqueテストで検知する - not_null 抽出・結合処理を書き換えるとデータの欠損 が起こりやすいため、not_nullテストで検知 する - relation 抽出・結合処理を書き換えるとデータの欠損 が起こりやすいため、参照整合を保てている かで検知する 完全合致テスト リファクタリング前後で、データが一切変わって いないことをテストする。 ただし、環境の違いによってデータが変わるた め、下記のようにテストコードを用意しておく。 - カラムの除外・指定 タイムスタンプなど、テーブル生成時刻で値 の変わるカラムを除外できるテストコードを 用意する - 抽出条件の指定 最新断面同士の比較など、比較対象を限定 できるようテストコードを用意する
© Recruit Co., Ltd. All Rights Reserved 完全合致テストの自動化 27 $
dbt build -s is_same --vars \ '{target_table: "sample_table", except_columns: "column1,column2", where_condition: column3="HOGE"}' 14:48:01 Running with dbt=1.2.1 14:48:01 Unable to do partial parsing because config vars, config profile, or config target have changed 14:48:04 Found 132 models, 577 tests, 0 snapshots, 0 analyses, 739 macros, 0 operations, 2 seed files, 138 sources, 24 exposures, 0 metrics 14:48:04 14:48:11 Concurrency: 4 threads (target='dev') 14:48:11 14:48:11 1 of 1 START table model dsu_treasure_data.is_same ............................. [RUN] 14:48:14 1 of 1 OK created table model dsu_treasure_data.is_same ........................ [CREATE TABLE (0.0 rows, 1.1 MB processed) in 3.21s] 14:48:14 14:48:14 Finished running 1 table model in 0 hours 0 minutes and 9.75 seconds (9.75s). 14:48:14 14:48:14 Completed successfully 14:48:14 14:48:14 Done. PASS=1 WARN=0 ERROR=0 SKIP=0 TOTAL=1 ※実際のところ、このコマンドはエラー時の解析が手間なので、コンパイルしたSQLの方がよく使われた 事例紹介 開発環境のデータと本番環境のデータが合致するのかをワンライナーで自動チェック
© Recruit Co., Ltd. All Rights Reserved 終わりに 28
© Recruit Co., Ltd. All Rights Reserved リファクタリングと dbt の持つ魅力
29 事前に将来の分析ニーズを把握し、汎用的なデータマートを用意することは難し い。 アドホックなクエリを許容しつつ、ドメイン知識を吸収してリファクタリングを進め るほうが、分析アウトプットも多く出せて、良いモデリングに近づける。 dbt は、リファクタリングを積極的に行える状態を作るのに最適 - モデリングルールの適用 - 振る舞いの定義 - データのテスト
© Recruit Co., Ltd. All Rights Reserved カーセンサーには、モダンな分析環境、大規模 なデータ、チャレンジングな課題が揃っていま す。
アナリティクスエンジニアリングを駆使して 一緒にビジネスを Drive して行く人を、 お待ちしています! 30
© Recruit Co., Ltd. All Rights Reserved <参考>dbt-project-evaluator 31 dbt-project-evaluator
という dbt project の良し悪しを判断する package も存在する。 https://docs.getdbt.com/blog/align-with-dbt-project-evaluator $ dbt build --select package:dbt_project_evaluator,+fct_model_fanout {{略}} 04:31:40 Completed with 1 warning: 04:31:40 04:31:40 Warning in test is_empty_fct_model_fanout_ (models/marts/dag/dag.yml) 04:31:40 Got 8 results, configured to warn if != 0 04:31:40 04:31:40 compiled SQL at target/compiled/dbt_project_evaluator/models/marts/dag/dag.yml/is_empty_fct_model_fanout_.sql 04:31:40 04:31:40 Done. PASS=14 WARN=1 ERROR=0 SKIP=0 TOTAL=15 ← 参照されているモデル を洗い出し、閾値(=5)以上 の数が紐づいていたらア ラートしてくれる