の エコシステムには 再利用可能な package が豊富にあり、packages.yml に書いて dbt deps で取得します。本記事では現場で確実に使う 2 つ ── dbt_utils と dbt-expectations を中心に。
packages.yml の書き方
packages.yml
YAML
packages: - package: dbt-labs/dbt_utils version: [">=1.1.0", "<2.0.0"]
- package: calogica/dbt_expectations version: [">=0.10.0", "<1.0.0"]
- package: dbt-labs/codegen version: [">=0.12.0", "<1.0.0"] # YAML 雛形自動生成
- package: dbt-labs/dbt_external_tables version: [">=0.9.0"] # 外部テーブル管理取得
Bash
dbt deps # packages.yml に基づき dbt_packages/ にダウンロードdbt_utils の頻出 15 個
| 関数 | 用途 | 例 |
|---|---|---|
generate_surrogate_key | 複数カラムから代替キー生成 | {{ dbt_utils.generate_surrogate_key(['id','date']) }} |
star | テーブルの全カラムを except で選択 | SELECT {{ dbt_utils.star(ref('orders'), except=['_internal']) }} |
union_relations | 複数テーブルを UNION ALL | {{ dbt_utils.union_relations([ref('a'), ref('b')]) }} |
pivot | 動的 pivot | EP.08 参照 |
unpivot | wide → long | {{ dbt_utils.unpivot(...) }} |
get_column_values | ユニーク値取得 | {% set vals = dbt_utils.get_column_values(...) %} |
group_by | GROUP BY 1,2,3 を簡潔に | {{ dbt_utils.group_by(3) }} |
safe_divide | 0 除算回避 | {{ dbt_utils.safe_divide('a','b') }} |
date_spine | 日付の連続テーブル | {{ dbt_utils.date_spine(...) }} |
type_string | アダプタ非依存の型 | {{ dbt.type_string() }} |
generate_series | 整数の連続 | {{ dbt_utils.generate_series(100) }} |
deduplicate | 重複排除 (keep=latest) | {{ dbt_utils.deduplicate(...) }} |
get_relations_by_pattern | テーブル名パターンで取得 | ワイルドカードunion |
width_bucket | 数値ビニング | ヒストグラム集計 |
haversine_distance | 緯度経度から距離 | 店舗距離計算 |
dbt_utils.star ── SELECT * を安全に
SELECT * の代替
SQL
-- 危険: 上流のスキーマ変更が直撃SELECT * FROM {{ ref('stg_orders') }}
-- 安全: 内部カラムを除外SELECT {{ dbt_utils.star( ref('stg_orders'), except=['_loaded_at', '_internal_flag'] ) }}FROM {{ ref('stg_orders') }}
-- prefix 付与SELECT {{ dbt_utils.star(ref('stg_customers'), relation_alias='c', prefix='cust_') }}FROM {{ ref('stg_customers') }} cdbt_utils.surrogate_key ── 主キー生成
複合主キーから代替キー
SQL
SELECT {{ dbt_utils.generate_surrogate_key(['date', 'customer_id', 'product_id']) }} AS sales_id, date, customer_id, product_id, amountFROM {{ ref('stg_sales') }}-- → sales_id は 32 文字の hash (md5)dbt-expectations ── 30+ の検証
schema.yml で使える代表 10 個
YAML
tests: # 範囲 - dbt_expectations.expect_column_values_to_be_between: min_value: 0 max_value: 100000
# 行数 - dbt_expectations.expect_table_row_count_to_be_between: min_value: 1000
# ユニーク数 - dbt_expectations.expect_column_distinct_count_to_be_between: min_value: 100 max_value: 1000000
# 値が他テーブルに存在 - dbt_expectations.expect_column_values_to_be_in_set: value_set: ['JP', 'US', 'GB']
# 平均が範囲内 - dbt_expectations.expect_column_mean_to_be_between: min_value: 1000 max_value: 50000
# 標準偏差が範囲内 - dbt_expectations.expect_column_stdev_to_be_between: min_value: 0 max_value: 5000
# 正規表現マッチ - dbt_expectations.expect_column_values_to_match_regex: regex: '^[A-Z]{2}-\d{4}$'
# 日付が単調増加 - dbt_expectations.expect_column_values_to_be_increasing: sort_column: ordered_at
# 別テーブルとの行数比較 - dbt_expectations.expect_table_row_count_to_equal_other_table: compare_model: ref('fct_orders_legacy')
# 集計値の比較 - dbt_expectations.expect_column_sum_to_be_between: min_value: 1000000codegen ── を自動生成
新ソースの schema.yml 雛形を生成
Bash
# 新しい source テーブルから schema.yml を生成dbt run-operation generate_source --args '{ schema_name: stripe, database_name: raw}'# → コピペ用の YAML が出力される
# model から schema.yml 雛形dbt run-operation generate_model_yaml --args '{ model_names: [dim_customers, fct_orders]}'業界別の便利パッケージ
| パッケージ | 用途 |
|---|---|
dbt-labs/segment | Segment イベント整形 |
fivetran/stripe | Stripe 標準モデル |
fivetran/salesforce | Salesforce ELT 標準モデル |
dbt-labs/snowplow | Snowplow イベント解析 |
dbt-audit-helper | model 移行時の差分検証 |
dbt-osmosis | schema.yml の自動更新 |
次の話
EP.10 では seeds (静的データ) と snapshots (SCD Type 2) を扱います。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。