VantageでData Build Tool（dbt）を使用する

著者 [Adam Tworkiewicz](adam.tworkiewicz@teradata.com)
最終更新日 2021年12月28日

:::note warn
警告
本記事はTeradata Corporationのサイト[Getting Started](https://quickstarts.teradata.com/index.html#getting-access-to-vantage)に掲載された内容を抄訳したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

# 概要
このチュートリアルでは、Teradata Vantageでdbt (Data Build Tool)を使用する方法について説明します。オリジナルの[dbt Jaffle Shopチュートリアル](https://github.com/dbt-labs/jaffle_shop-dev)をベースにしています。いくつかのモデルは、VantageでサポートされるSQLに調整されています。

# 前提条件
・Teradata Vantageインスタンスにアクセスできること。
・Python 3.7、3.8、3.9のいずれかがインストールされていること。

::: note info
メモ！
Vantageの新しいインスタンスが必要な場合は、[Google Cloud](https://qiita.com/ykswi/items/10a382de5fa5a4a42c50)、[Azure](https://qiita.com/ykswi/items/2c30aa1f5413b16c838c)、[AWS](https://qiita.com/ykswi/items/fba559149ad568678d58)のクラウドにVantage Expressという無料版をデプロイメントすることができます。また、[VMware](https://qiita.com/ykswi/items/ebe1d854c38db9bb0f51)、[VirtualBox](https://qiita.com/ykswi/items/ffadaa375add309f2075)、または[UTM](https://qiita.com/ykswi/items/94995954ae723185c2f7)を使用して、ローカルマシン上でVantage Expressを実行することもできます。
:::

# dbtのインストール
①	チュートリアルリポジトリをクローンしプロジェクトディレクトリにcdします。
```:CloneRepository
git clone https://github.com/Teradata/jaffle_shop-dev.git jaffle_shop
cd jaffle_shop
```
②	dbtとその依存関係を管理するために新しいPython環境を作成し、環境をアクティブにします。
```:CreatePythonEnvironment
python3 -m venv env
source env/bin/activate
```
③	dbt-teradataモジュールとその依存関係にあるモジュールをインストールします。dbtのコアモジュールも依存関係のあるモジュールとして含まれているので、別にインストールする必要はありません。
```:InstallDbt
pip install dbt-teradata
```

## dbt の構成
Vantageに接続するためにdbtを設定します。
以下の内容で *$HOME/.dbt/profiles.yml*ファイルを作成します。
お使いのVantage環境に合わせて<**host**>, <**user**>, <**password**> を変更してください。

::: note info
データベースの設定
次の dbtプロファイルは**jaffle_shop**という名前のデータベースを指しています。スキーマ値を変更してご利用のTeradata Vantageのデータベースを指すようにするか、**jaffle_shop**データベースを作成してご利用ください。
:::

```:Profile
jaffle_shop:
  outputs:
    dev:
      type: teradata
      host: <host>
      user: <user>
      password: <password>
      logmech: TD2
      schema: jaffle_shop
      tmode: ANSI
      threads: 1
      timeout_seconds: 300
      priority: interactive
      retries: 1
  target: dev
```
```sql:CreateJaffleShop.sql
CREATE DATABASE jaffle_shop
AS PERMANENT = 110e6,
    SPOOL = 220e6;
```

さて、プロファイルができたのでセットアップを検証してみましょう。
```:Debug
dbt debug
```

debugコマンドがエラーを返した場合、**profiles.yml**の内容に問題がある可能性があります。

# ジャッフルショップの倉庫について
**jaffle_shop**は架空のEコマースストアです。このdbtプロジェクトはアプリのデータベースからの生データを分析に適した顧客と注文のデータを持つディメンションモデルに変換します。

アプリからの生データは、顧客、注文、支払いで構成されており、以下のようなエンティティ関係図があります。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/fa2e53d7-d187-c994-609a-79ad2da2050b.png)

dbtはこれらの生データのテーブルから、分析ツールに適した以下のような次元モデルを構築します。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/5f562e89-001f-1633-5464-1279dc0793d1.png)

# dbtを実行する
## 生データテーブルの作成
実際の業務では、Segment、Stitch、FivetranなどのETLツールから生データを取得することになります。今回は、dbtのseed機能を使って、csvファイルからテーブルを作成します。csvファイルは、./dataディレクトリにあります。dbtはファイルを検査し、型推論を行い、どのデータ型をカラムに使用するかを決定します。
では、生データのテーブルを作成してみましょう。

```:Seed
dbt seed
```

**jaffle_shop**データベースには、**raw_customers**, **raw_orders**, **raw_payments**の3つのテーブルが表示されているはずです。これらのテーブルにはcsvファイルからのデータが入力されているはずです。

## ディメンジョンモデルを作成する

生データを持つテーブルが手に入ったので、dbtにディメンジョンモデルを作成するように指示することができます。
```:Run
dbt run
```

**CREATE TABLE/VIEW FROM SELECT** SQLを使用してdbtは追加のテーブルを作成しました。最初の変換でdbtは生データのテーブルを取り出し、**customer_orders**、**order_payments**、**customer_payments**という非正規化された結合テーブルを作成しました。これらのテーブルの定義は、**./marts/core/intermediate**に記載されています。2番目のステップでは、dbtは**dim_customers**テーブルと**fct_orders**テーブルを作成しました。これらはBIツールに公開したいディメンジョンモデルテーブルです。

## データをテストする

dbtはデータに対して複数の変換を適用しました。どうすれば次元モデルのデータが正しいことを確認できるでしょうか？ dbtではデータに対してテストを定義し実行することができます。テストは **./marts/core/schema.yml** で定義されています。このファイルにはすべてのリレーションシップにおける各カラムが記述されています。各カラムは **tests** key の下に複数のテストを設定することができます。例えば、**fct_orders.order_id** カラムには、一意でNULLでない値が含まれることが期待されます。生成されたテーブルのデータがテスト条件を満たしていることを検証するために以下を実行します。

```:Test
dbt test
```
## ドキュメントを生成する
このモデルは、ほんの数個のテーブルで構成されています。もっと多くのデータソースがありもっと複雑なディメンジョンモデルがある場合を想像してください。また、Data Vault 2.0の原則に従って、生データとディメンションモデルの間に中間領域を設けることも可能でしょう。もし、入力、変換、出力が何らかの形で文書化されていれば、便利だと思いませんか？ dbtでは、設定ファイルから文書を生成することができます。

```:DocsGenerate
dbt docs generate
```
これにより**./target**ディレクトリにhtmlファイルが生成されます。

独自のサーバーを起動して、ドキュメントを閲覧することができます。次のコマンドは、サーバーを起動し、ブラウザーのタブにドキュメントのランディングページを開きます。

```:DocsServe
dbt docs serve
```

# まとめ
このチュートリアルでは、Teradata Vantageでdbtを使用する方法を説明します。サンプルプロジェクトでは、生データを受け取り、ディメンションデータマートを作成します。複数のdbtコマンドを使用して、csvファイルからのテーブル投入（**dbt seed**）、モデルの作成（**dbt run**）、データのテスト（**dbt test**）、モデルドキュメントの生成と提供（**dbt docs generate, dbt docs serve**）などを行いました。

# さらに詳しく

・[dbt documentation](https://docs.getdbt.com/docs/)

・[dbt-teradata plugin documentation](https://github.com/Teradata/dbt-teradata)

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)