【dbt Docs】Building a dbt Project - Sources
Sources
Related reference docs
- Source properties
- Source configurations
-
{{ source() }}
jinja functionselect * from {{ source(source_name, table_name) }}
-
source freshness
command
dbt source
コマンド。ソースデータの「鮮度」を計測する。結果は、target/sources.json
に保存される。
Using sources
EL(T)で取り込んだデータに名前をつけたり、説明をつけたりすることができる。
-
{{ source() }}
を用いて使うテーブルを指定できる、データリネージュを作る助けとなる - ソースデータのテストができる
- ソースデータの鮮度を計算できる
Declaring a source
.yml
ファイル。sources
の項目に階層化で設定可能。
version: 2
sources:
- name: jaffle_shop
tables:
- name: orders
- name: customers
- name: stripe
tables:
- name: payments
Selecting from a source
設定をしておくと、モデル内で {{ source() }}
で参照できる。
select
...
from {{ source('jaffle_shop', 'orders') }}
left join {{ source('jaffle_shop', 'customers') }} using (customer_id)
↓
select
...
from raw.jaffle_shop.orders
left join raw.jaffle_shop.customers using (customer_id)
{{ source()) }}
を使うとモデルとソースの間に依存関係が生まれる。
Testing and documenting sources
(ソースのテストとドキュメント化)
version: 2
sources:
- name: jaffle_shop
description: This is a replica of the Postgres database used by our app
tables:
- name: orders
description: >
One record per order. Includes cancelled and deleted orders.
columns:
- name: id
description: Primary key of the orders table
tests:
- unique
- not_null
- name: status
description: Note that the status can change over time
- name: ...
- name: ...
FAQs
-
ソースが不適切な名前のスキーマまたはテーブルにある場合はどうなりますか?
-
ソースがターゲットデータベースとは異なるデータベースにある場合はどうなりますか?
-
ソースから選択するには引用符を使用する必要がありますが、どうすればよいですか?
snowflakeではよくある話。
quoting
プロパティを使ってやる。version: 2 sources: - name: jaffle_shop database: raw quoting: database: true schema: true identifier: true tables: - name: order_items - name: orders # This overrides the `jaffle_shop` quoting config quoting: identifier: false
-
ソースだけでテストを実行するにはどうすればよいですか?
$ dbt test --select source:* $ dbt test --select source:jaffle_shop $ dbt test --select source:jaffle_shop.orders
-
1つのソースのダウンストリームでモデルを実行するにはどうすればよいですか?
$ dbt run --select source:jaffle_shop+ $ dbt run --select source:jaffle_shop.orders+
Snapshotting source data freshness
いくつかの追加構成を使用して、dbtはオプションでソーステーブル内のデータの「鮮度」をスナップショットできます。これは、データパイプラインが正常な状態にあるかどうかを理解するのに役立ち、ウェアハウスのSLAを定義するための重要なコンポーネントです。
Declaring source freshness
ソースの鮮度情報をスナップショットするように設定するには、freshness
ブロックを定義する。loaded_at_field
で設定する。
version: 2
sources:
- name: jaffle_shop
database: raw
freshness: # default freshness
warn_after: {count: 12, period: hour}
error_after: {count: 24, period: hour}
loaded_at_field: _etl_loaded_at
tables:
- name: orders
freshness: # make this a little more strict
warn_after: {count: 6, period: hour}
error_after: {count: 12, period: hour}
- name: customers # this will use the freshness defined above
- name: product_skus
freshness: null # do not check freshness for this table
freshness
ブロックには、warn_after
とerror_after
が設定できる。こちらを設定すれば、回の設定にはすべて反映する。
Checking source freshness
ソースの鮮度情報をスナップショットするには、dbt source freshness
コマンドを使う。
$ dbt source freshness
dbtはfreshnessプロパティを使って、以下のようなselect
句を構築しています。このクエリはログで確認することができます。
select
max(_etl_loaded_at) as max_loaded_at,
convert_timezone('UTC', current_timestamp()) as snapshotted_at
from raw.jaffle_shop.orders
FAQs
-
鮮度スナップショットからテーブルを除外するにはどうすればよいですか?
データソース内の一部のテーブルは、頻繁に更新されない場合があります。freshnessソースレベルでプロパティを設定した場合、このテーブルはチェックに失敗する可能性があります。
これを回避するには、テーブルの鮮度をnull(freshness: null)に設定して、特定のテーブルの鮮度を「設定解除」します。
- details 1つのソースのみの鮮度をスナップショットするにはどうすればよいですか?
フラグを使用して--select、特定のソースの鮮度をスナップショットをとる。
::: -
鮮度の結果はどこにでも保存されていますか?
各テーブルの 合格/警告/エラー を保存する。
target/
のsources.json
Discussion