Closed68

dbt-labs packages

takertaker

暇で、次の職場でdbtを色々使うことになりそうなので、便利なものがないかザーッと見てみる。
とりあえず、dbtの概念自体は長年色々やっていたので、つかめるだろう。
が付属するエコシステム周りは知らないと辛いこともあるかと思うので、「知るために」ザーッと洗う。

takertaker

synapse_statistic

https://hub.getdbt.com/aaron-zhou/synapse_statistic/latest/

Azureのsynapse用のpackage。
分析用のviewを作ることができるらしい。Azure synapseは使ったことがないので詳細はわからない。
コードをみたが、information schemaのようなものを作ってくれるものっぽかった。

なるほど、dbtはELTを委ねる認識が強かったがこういうものも管理させるという選択肢もあるのかもしれない。

takertaker

dbt_artifacts

https://hub.getdbt.com/brooklyn-data/dbt_artifacts/latest/

dbt上で管理されているものをdwhに上げ、さらにいい感じのmartを作成してくれる。
実行履歴や、sourceや変数定義なども含まれる模様。

uploadされるデータなどはすべてこちらにある。
https://brooklyn-data.github.io/dbt_artifacts/#!/model/model.dbt_artifacts.exposures

データガバナンスのためにdbt以外でメタデータやリネージュを構築することは多くあると思われるため、これを元データにするのは大変良さそう。

ジョブの実行状態のモニタリングなどもこれを利用すれば良さそうな気はする。

documentを読めばわかるが、on-run-endを入れずにデータがuploadされずに悶ていた。
仕組みをよくわかっていない証拠ですね。

takertaker

dbt_date

https://hub.getdbt.com/calogica/dbt_date/latest/

日付系の便利関数が集まっている・・・!
基本これらは自前で実装(することもしないことも)あるので、これらが最初から用意されるのはとてもいいですね。
あとは、Bigquery/snowflake/Redshiftで関数や引数が異なることも多いので、これで抽象化されるのはとてもいい。

timezoneも変数で固定化できる・・・うれP

takertaker

dbt-expectations

https://hub.getdbt.com/calogica/dbt_expectations/latest/

Greate Expectetions packages for Pythonに影響を受けたらしいが、もとを知らない。
テスト系のpackageであることがわかる。
かなり多くのテストがある。

いいなーって思ったのをメモってく

  • expect_column_to_exist
    • select * で雑に書いちゃうときに、上流の変更だったりでなくなったりしちゃうことが過去に稀にあったので、それを検知できるのはいい
  • expect_table_aggregation_to_equal_other_table
    • データソースは異なるが、集計値は一致スべきであるデータなどがある、そういったときに良い
  • expect_column_values_to_be_between
  • expect_column_values_to_be_increasing/decreasing
    • 累積系のデータとかの検証にいいよね
  • expect_column_value_lengths_to_be_between
    • まれにある人間入力系のマスターデータでデータフォーマットの異常検知に使えそうな感じ

他にもいろいろ使えそうなのがあった。
基本的にテストを書く場合は、頑張る前にこのpackageでカバーできないか?を確認すべきっぽい。

takertaker

airbyte_*

https://airbyte.com/ のコネクター用のモデル定義。
違う話だけど、データメッシュを作るときとかにdbt packageとしてデータ定義を公開し、それを利用することでhogehogeとかできそう・・・?って見えた。

airbyteはELTツール。一瞬検討したが、つかわなかった懐かしい。

takertaker

dbt_profiler

https://hub.getdbt.com/data-mie/dbt_profiler/latest/

dbtのprofilerかと思ったが、データのプロファイリングを行うもの。
データカタログでありがちな、最大/最小/分布みたいなのを集計し、document化する。
システムメタデータの生成を自動化してくれる、というイメージ化。
ここらへんを時前でやるのは結構骨が折れるから、いいですね。

profile用のsqlを作る必要があるっぽいから、そこら編の管理とかすべてのテーブルを対象にするのは地獄なのでうまく工夫をしたい。

コマンドラインから指定のテーブルを取得する機能もあるようなので、CIに組み込みやすさもありそう。

$ dbt run-operation print_profile_schema --args '{"relation_name": "stg__test_table"}'
04:10:20  Running with dbt=1.4.1
04:10:23  version: 2
models:
- name: stg__test_table
  description: ''
  columns:
  - name: id
    description: ''
    meta:
      data_type: number
      row_count: 10.0
      not_null_proportion: 1.0
      distinct_proportion: 0.2
      distinct_count: 2.0
      is_unique: false
      min: '1'
      max: '2'
      avg: 1.5
      std_dev_population: 0.5
      std_dev_sample: 0.5270464875131984
      profiled_at: 2023-02-21 20:10:23.394 -0800
  - name: name
    description: ''
    meta:
      data_type: text
      row_count: 10.0
      not_null_proportion: 1.0
      distinct_proportion: 0.2
      distinct_count: 2.0
      is_unique: false
      min: null
      max: null
      avg: null
      std_dev_population: null
      std_dev_sample: null
      profiled_at: 2023-02-21 20:10:23.394 -0800
takertaker

ga4_metrics

https://hub.getdbt.com/datomni/ga4_metrics/latest/

GA4のデータをいい感じに分析しやすいデータにしてくれるやつ。
UAの頃からそうだったけど、素のデータだとstructだったり扱いにくいからね。
ただeventがflattenされてテーブル化されたり、結構気をつけないといけなそう。
これを参考にしつつ、結局自分たちでカスタマイズって感じka

takertaker

profitwell_metrics

https://hub.getdbt.com/datomni/profitwell_metrics/latest/

Profitwellというデータのよくある指標を集計してくれるやつ。
作者がGA4と同じ人。この人が使ってるデータなんだろうけど、それを公開してくれるとかすごい。

profitwellというのはsubscriptionの分析用ツール?っぽい。あまりこの分野には明るくないので、よくわからない。

takertaker

dbt_project_evaluator

https://hub.getdbt.com/dbt-labs/dbt_project_evaluator/latest/

データモデルとしてのbest practiceを集めて、ルール化したもの。
ある種のlinter的なものと思うが、アラートだらけにならないのだろうか?

ルールいろいろある。

  • Direct Join to Source
    • 直接sourceをjoinしているケース
      • これはたしかに
  • Downstream Models Dependent on Source
    • downstreamのデータがsourceに依存しているケース
      • これはたしかに
  • Hard Coded References
    • 直接テーブルを参照しているケース
      • これはたしかに
  • Model Fanout
    • 多いと良くないケースはあるが、割とあるよなーっていう感覚。直接は意外とないか?
  • Multiple Sources Joined
    • 複数のsourceがjoinされている
      • これはたしかに
  • Rejoining of Upstream Concepts
    • 1つのSQLでやれ、という話はそのとおりだが、経験から一度テーブルに出力したいケースもあるんだよなー

ちょっと全部はメモできないが、やる必要性にはレベル感はあった(それはそう)

ルールの柔軟な制御はできるようなのでうまく使っていければよいね。

takertaker

metrics

https://hub.getdbt.com/dbt-labs/metrics/latest/

集計をmacro化する、というもの。
よくある集計を設定ベースでできる。
ぼくはSQL書けてしまうので、そっちが早くないか?という感覚がある。
レビューはし易いかも?

色々思うところはあるが、要検討。

takertaker

考えたが、人がわかりやすいのが重要ではなくシステムがわかりやすくすることに真価がある、ということを思い見方が変わった。
データガバナンスの文脈でシステムでの解釈が可能な状態にすることでメリットがあると思った。

takertaker

audit_helper

https://hub.getdbt.com/dbt-labs/audit_helper/latest/

データの比較を行うためのpackage.
名前から監査ログとかか?って思ったけど、データの同一性を確認するという意味での監査だったらしい。

ここらへんのクエリは地味に使う割に共通化するモチベーションが起きないので嬉しいですね。
比較する粒度を制御できるっぽいのでうれしい。

定常的なモデルに組み込むというよりは、データ・処理の移行や集計の確認などでうまく使えれば良さそう。

takertaker

dbt_utils

https://hub.getdbt.com/dbt-labs/dbt_utils/latest/

よく使うクエリ集。
めっちゃいろいろある。

Test

定数比較ではなく、行数は他のモデルと比較できるのは大変良い

なんというかやったほうがいいし、やりたいがなかなか手が回らない系の静的テストが概ねあるという印象。。。
うまく集計は結構複雑なことも多いし、こういうテストでデータのあるべき状態を記述できるのはいいよね~~~

Macros

  • get_column_values
    • 例えば縦を横に変換するときにいいよね~
      • 条件もかけるらしいし。。。
  • get_relations_by_pattern
    • まれによくやるやつ

こっちは使い所や魔改造ができるな、という感じ。
あんまり使ってはいけない感覚。

SQL generators

  • data_spine
    • うれしい!
      • Bigqueryは簡単に生成できるのだけど、Redshiftはいろいろあって強引にしないといけないので
  • star
    • 地味だが超嬉しい!!
      • BQでいうexceptをしたいときに他DWHだとできなくて辛い

こっちは積極的に使っていきたい。
使うことによってクエリの意図が簡単に伝えられるのはうれしいよね。

takertaker

dbt-codegen

https://hub.getdbt.com/dbt-labs/codegen/latest/

dbtのコードを生成するやつ。
sourceの既存テーブルのimportとかないのかなーとか思ってたからやっぱりあった。
modelの生成もいいですね。

CTESの生成もありといえばあり。。。か?いや微妙そう。

takertaker

dbt_external_tables

https://hub.getdbt.com/dbt-labs/dbt_external_tables/latest/

外部テーブル用のpacakge。
ん、切り出されているということは標準では外部テーブルは扱えない?
標準で「external」定義することで扱えるがよりよく扱うためのものっぽい。

これを入れることで未定義である外部テーブルをdbtごしに作成してくれるもの?っぽい。
加えて、paritiion設定などもやってくれるので、これはうれしい。

takertaker

dbt_dataquality

https://hub.getdbt.com/divergent-insights/dbt_dataquality/latest/

dbt freshness/testの結果からデータ品質の可視化を行うもの。
ぱっと見はすげーっとなったが、使い所は難しそう。
レポート用のファイルを生成するらしいので、その内容次第では品質のmonitoring用途の一部として使えなくはない?

でもたぶんdbt_artifactsを仕込めばいいんだよなーっていう感覚がある。

takertaker

dbt_snow_mask

https://hub.getdbt.com/entechlog/dbt_snow_mask/latest/

snowflakeのデータマスキングのpackage.
データマスキング側の機能をよくしらないのでなんともいえない。
ただパッと見は、ymlに宣言的にかけるのでわかりやすそうではあった。

だが、modelを記述するdbtにそこまでやらせるべきなのか?という話はあるかも?

takertaker

fivetran

大量のコネクターのモデル。
こういうのをちゃんと用意してくれるのはいいよね。

takertaker

dq_tools

https://hub.getdbt.com/infinitelambda/dq_tools/latest/

「Data Quality tools」とのこと。

6つの観点で評価を行う

  • Accuracy
  • Consitency
  • Completeness
  • Timeliness
  • Validity
  • Uniqueness

指標はカスタムできるが非推奨らしい。

組み込み方自体は、dbt testに専用のmacroを利用して行うとのこと。
結局各ドメインごとにどれがどうであればよいのかは変わってくると思うので、どのテストが何を目的としたものなのかを合意をとって、dbt artifactsでmonitoringしたほうが良さそう?って思った。

takertaker

dbt_graph_theory

https://hub.getdbt.com/jpmmcneill/dbt_graph_theory/latest/

グラフ構造をdbtでうまくモデリングしたらしい。
recursive CTEを使ってやるやつ。
たぶんこれを使うシチュエーションになったら便利だと思う。
この手のクエリは読み解けないし、バグ入りやすいし、、、

でも書かなくていい状況作りたいね。。。

takertaker

dbt_ml

https://hub.getdbt.com/kristeligt-dagblad/dbt_ml/latest/

BQMLをdbtで扱うというもの。
めっちゃいいっすね。
custom materializeにmodelが加わったイメージ出かけるのでよい。

hyper parameterのチューニングもやれるらしいので便利。

ただ、BQ MLが結局本番運用されたことはないのであった。

takertaker

athena_utils

https://hub.getdbt.com/lalalilo/athena_utils/latest/

AWS Athenaのutlility。
dbt_utilsがathenaに対応していないので拡張しようというもの。

Athenaはテーブル定義でだいぶハックができてしまうので、そこら編がうまくカバーできていると嬉しいなと思ったが、そこは守備範囲外か。

takertaker

upstream_prod

https://hub.getdbt.com/lewisdavies/upstream_prod/latest/

上流データをprod(というか別の環境)のデータを使って下流のモデルを作るというやつ。
dbtのdeferオプションを使えば?って思った。

upstream-prod is a dbt package for easily using production data in a development environment. It's like an alternative to the defer flag - only without the need to find and download a production manifest.

manifestってなんだっておもったら、実行時にtargetフォルダに生成されるファイル。
あーこれからdbt_artifactはデータ生成してるのか・・・
そして、これはproductionではs3などに連携するのが良いっぽいな。

deferの場合は、このproduction用のファイルを持っておく必要があるらしい。
そこらへんがこのpackageだと不要っていうメリット。

nayamu

takertaker

materialize_dbt_utils

materilizeというdbのutil

materialize自体は知らなかった。
https://github.com/MaterializeInc/materialize

streamingデータに対しての分析を行う用途のdatabase。
へえ。

DuckDBもそうだが、OLAP周りも形態がいろいろ変わってきていると感じているので、新しい界隈をキャッチアップしていかないといけないな、と感じた。

takertaker

dbt_datamocktool

https://hub.getdbt.com/mjirv/dbt_datamocktool/latest/

source/refのモデルのデータをmock化するためのpackage。
seedデータと生成されたデータを比較するためのunit test package?

使い方がちょっとよくわからなかったが、
inputをseedのデータに置き換え、expectデータと一致するかをseedで比較するみたい。

          input_mapping:
            source('jaffle_shop', 'raw_customers'): ref('dmt__raw_customers_1')

で、sourceをローカルに配置されているseedファイルに置き換える

         expected_output: ref('dmt__expected_stg_customers_1')

でローカルに配置されているseedファイルと比較する。

この手のテストはデータの準備が大変なので限ったデータだけにしたいが、比較するためのロジックが予め準備されているのは最高

takertaker

dbt_product_analytics

https://hub.getdbt.com/mjirv/dbt_product_analytics/latest/

製品分析を提供するモデル。

  • event_stream
    • イベントの流れをトラッキングする
      • 新規→継続とかそういうやつ
  • funnel
    • ファネル分析
  • retention
  • flows

クエリでよく書く割にいつもしんどいクエリになりがちなのでいいですね。
ただしんどいクエリになるのは結構ドメインごとに集計条件がことなるという・・・
まあなので、これに食わせるモデル化をしっかりやろうっていう話か。
初期分析として入れておくと分析の初速が付きそうでよいかも。

takertaker

dbt_privacy

https://hub.getdbt.com/pvcy/dbt_privacy/latest/

メールアドレスなどのprivacyデータの保護を目的としてpackage。
いいんだけども、そもそも入る前にやる、というの要件に基本はいるので難しい・・・

DWHに入れてもいいが、外に出してはいけないっていうときにつかうとよい?
まああとはガバナンス的な話で「どういう maskingがあるのか」を知っておく意味でも一目透しておくと良いかも。

takertaker

dbt_constraints

https://hub.getdbt.com/snowflake-labs/dbt_constraints/latest/

制約に基づくテストを実行する、p-keyや参照整合性とか。
参照整合性のテストが振られている場合は、main tableにすべて含まれるかなど確認しに行くらしい。
データ基盤的な特性だと、テストにいろいろ工夫が必要かもなあとか思ったりした。
いまいち正確に把握できていないと思うので、後で試す。

takertaker

metalog

https://hub.getdbt.com/techindicium/metalog/latest/

dbtでmetaデータ管理をするやつ。

modelのconfigにデータを記述できる。
I/Fは外でも良いが生成システムとしてdbtを使うのはよさそうかも?
ビジネスメタデータ自体が非エンジニアじゃないパターンが多いので。

メタデータのスキーマもこれで定義できるとのこと。

takertaker

まとめ

途中からmodel系のpackageは端折ったが、2023-02-24時点のdbthubに https://hub.getdbt.com/ を一通り見ていった。
結果、以下のものはまた見ていきたい。

  • dbt_artifacts
  • dbt_date
  • dbt-expectations
  • dbt_profiler
  • dbt_project_evaluator
  • metrics
  • audit_helper
  • dbt_utils
  • dbt-codegen
  • dbt_external_tables
  • elementary
  • dbt_snowflake_monitoring
  • dbt_datamocktool

ここらへんは実際に使ってみて、より理解を深めていきたい。

感想

汎用モデルとしてのpackageと、dbtを拡張(データ品質/検証)するもの、クエリの簡易化マクロを提供しているpackageが大きく分けるとあるようだった。

汎用モデルは公開されているものを利用する、というよりは社内向けに育てていくとメリットが出そうに思った。
拡張系に関しては使い方を誤ると黒魔術になりがちそうだったので注意したほうが良さそうだった。
でも全体的に柔軟で自由度が高いツールであることがわかったので良かった。

このスクラップは2023/02/24にクローズされました