🕌

【dbt Docs】Building a dbt Project - Sources

2022/03/14に公開

Sources

https://docs.getdbt.com/docs/building-a-dbt-project/using-sources#declaring-a-source

Using sources

EL(T)で取り込んだデータに名前をつけたり、説明をつけたりすることができる。

  • {{ source() }}を用いて使うテーブルを指定できる、データリネージュを作る助けとなる
  • ソースデータのテストができる
  • ソースデータの鮮度を計算できる

Declaring a source

.ymlファイル。sourcesの項目に階層化で設定可能。

models/<filename>.yml
version: 2

sources:
  - name: jaffle_shop
    tables:
      - name: orders
      - name: customers

  - name: stripe
    tables:
      - name: payments

Selecting from a source

設定をしておくと、モデル内で {{ source() }}で参照できる。

models/orders.sql
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

(ソースのテストとドキュメント化)

models/<filename>.yml
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で設定する。

models/<filename>.yml
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_aftererror_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