dbt公式チュートリアルdbt Fundamentalsをやってみた

はじめに

dbtの公式チュートリアルであるdbt Fundamentalsを完了しました

dbtの概要と、dbt Fundamentalsの感想をまとめます。

dbtとは?

引用:dbt Labs | Transform Data in Your Warehouse

dbt(data build tool)はETLのTransformに焦点を当てたツールです。

  • Extract:データの抽出
  • Transforl:データの変換(dbtのフィールド!)
  • Load:データの配置

SQLやNoSQLによる開発体験を大きく向上することができます。

dbtの魅力

クエリの簡潔化と保守性の向上

あるソーステーブルのカラム名だけリネームする処理を書くとします。 ソーステーブルをjaffle_shop.orders, リネーム後のテーブルをjaffle_shop.staged_ordersとすると、Hiveでは以下のように書けます。

use jaffle_shop;
 
create table staged_orders (
    order_id int,
    customer_id int,
    order_date date,
    status string
)
row format delimited
fields terminated by ','
stored as textfile;
 
with sources as (
    select * from orders
),
staged as (
    select
        id as order_id,
        user_id as customer_id,
        order_date,
        status
    from sources
)
insert into staged_orders
select * from staged;

次に同じ処理をdbtで書いてみます。

with sources as (
    select * from {{ source('jaffle_shop', 'orders') }}
),
staged as (
    select
        id as order_id,
        user_id as customer_id,
        order_date,
        status
    from sources
)
select * from staged

DDLを省略できました。テーブルのCREATE文などはdbtが自動的に発行してくれます。

またソーステーブルの参照部がパラメータ化されています。 ソーステーブルの詳細は別ファイルで管理されており、環境に応じて柔軟に変更できます。

どちらが開発しやすいかは一目瞭然です。 dbtを使えば、可読性と保守性が高いクエリを書けます。

ドキュメントの動的な生成

クエリを用意すれば半自動的にドキュメントが作成されます。

デフォルトで用意されているのはテーブル名、カラム名、カラムの型など基本的な情報のみです。

ですが別途yamlを用意することで、より詳細な情報を加えることもできます。

データリネージの動的な生成

テーブル間の依存関係を表すデータリネージも動的に生成されます。

データリネージはデータの流れを理解するのに役立ちます。手作業で作るとかなりの手間がかかるので生産性が向上することは間違いありません。

クエリのテスト

yamlを使えば簡単にテストを書けます。 説明のため先程のクエリを再掲します

with sources as (
    select * from {{ source('jaffle_shop', 'orders') }}
),
staged as (
    select
        id as order_id,
        user_id as customer_id,
        order_date,
        status
    from sources
)
select * from staged

このテストは以下のように書けます。

version: 2
 
models:
  - name: stg_orders
    columns:
      - name: order_id
        tests:
          - unique # ユニークか?
          - not_null # Nullでないか?
      - name: status
        tests:
          - accepted_values: # 列挙する値のみ含まれるか?
              values:
                - shipped
                - completed
                - returned
                - pending
                - placed
                - return_pending
      - name: customer_id
        tests:
          - relationships: # 他のテーブルのカラムの要素だけで構成されているか?
              to: ref('stg_customers')
              field: customer_id

あらかじめ用意されているテスト以外に、独自に定義することも可能です。

dbt Funtamentals

公式によるチュートリアルです。dbtが生まれた背景と、全体像を理解できる構成になっています。 dbt Fundamentals

9つのレッスンで構成されており、ハンズオン形式で手を動かしながらの受講が想定されています。

各レッスンは動画、テキスト、クイズで構成されており、クイズに完答することでレッスンクリアとなる流れになっています。クイズは大体4~6問程ですが、一問でも誤ると一問目からになります。なかなかシビアです。やや難易度が高いものも含まれていたので、通過するまで大体2~3回ほどやり直すことが多かったです。

動画も含めてレッスンはすべて英語でした。テキストとクイズは、外部の翻訳ツールによって日本語訳が可能ですが、動画は英語しか選択肢がなかったので大変でした。かろうじて英語字幕に対応している点は救いでしたが、英語が苦手な方にはお勧めできません。

ある程度英語に自信がある方にはおすすめです。難しい単語が現れることもなく、発音もかなりはっきりしていたので語学的な難易度はそこまで高くないと感じました。

公式の見積もりでは5時間程度でしたが、僕は約12時間ほどかかってしまいました。 やはり言語の壁が大きかったのだと思います。

引用:dbt Funtamentals Welcome to dbt Fundamentalsより

内容自体はとてもよかったです。主要機能を含めたdbtの全体像と、基本的な操作を理解できました。

ただ環境構築については少し説明不足な印象を受けました。dbtの実行環境としてDWHを別途用意する必要があります。慣れてない方は想定よりも時間を取られるかもしれません。

さいごに

日本語教材としては「dbtとは?|dbtで始めるデータパイプライン構築〜入門から実践〜」が良さそうです。英語が不得意な方にはこちらをおすすめします。

結果的に英語の学習にもなったので受講して良かったと感じています。 ある程度英語に自信があり、dbtの概要をてっとり早く知りたい方にはおすすめです。

dbt Fundamentals