【dbt入門】基本的なコマンドを理解する_何ができる？（1/4）

こんにちは、まつきです。
dbtは、データアナリストがExtract-Load-Transform(ELT)パイプラインの「変換(Transform)」ステップを実行できるようにするツールです。

この記事では
dbt Labs社より提供されているGitHubリポジトリ「jaffle-shop」を利用してdbtでどんなことができるのか実際に見ていきたいと思います。

【目次】
1. 事前準備
1-1. dbtアカウント作成
1-2. GitHub利用リポジトリの確認
1-3. GitHubリポジトリの作成
1-4. BigQuery環境の設定
2. 環境設定
2-1. dbt Cloudで新規プロジェクトを作成
2-2. BiqQueryへの接続設定
2-3. リポジトリの設定
2-4. 本番環境の設定
3. dbt でコマンド実行
3-1. dbt seed：ソースデータの作成（BigQuery）
3-2. dbt run：モデルの実行
3-3. dbt test：テストの実行
3-4. dbt build：プロジェクトの実行
3-5. dbt docs generate：ドキュメントを生成



# 1. 事前準備
### 1-1. dbtアカウント作成
まずはdbtのアカウントを作成しましょう。
https://www.getdbt.com/product/dbt-cloud

[Try dbt Cloud free]ボタンでも[Create a free account]ボタンからでも構いませんので、
いずれかをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/18cb59b6-bb57-f32c-8aac-fb8bebfeac22.png)

メールアドレス等の情報を入力し、[Create my account]を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/e651a430-2b82-2c1a-edee-bce09b86a5f1.png)

入力したメールアドレス宛にdbtからメールが届きますので、[Verify your email address]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/862cba73-371f-f905-52d3-86e7972a6a21.png)

こちらでアカウント作成は完了となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/54a989ca-08fe-b1ab-e166-86d4d6bfaef2.png)


### 1-2. Github利用リポジトリの確認
今回利用するGitHubリポジトリのテンプレートを簡単に確認しておきましょう。
https://github.com/dbt-labs/jaffle-shop


### 1-3. GitHubリポジトリの作成
前段で確認したリポジトリをコピーして、今回利用するGitHubリポジトリを作成します。
今回はGitHubアカウントを持っている前提で記載します。

[Use this template]-[Create a new repository]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/901f077a-4196-ef51-4f09-3c43e0cc35b4.png)

リポジトリ名は任意なので今回は「jaffle_shop_demo_bq」としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/ee04ba9a-5924-c8f7-a2fd-aeedcd550c40.png)

リポジトリの作成が完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/508ee442-2392-c1d5-b01b-1ed5d1abaf82.png)


### 1-4. BigQuery環境の設定
利用にあたってBigQuryのデータセット作成とサービスアカウント設定を実施します。
今回はGoogle CloudのProjectは既に存在する前提で記載します。
まずはBigQuryのデータセット作成を実施します。
GCPのBigQuery Studioから対象のプロジェクト右の「・・・」から[データセットを作成]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/f78fabd4-092a-b151-4568-9b108ecc1309.png)

データセットIDは
```
jaffle_shop_demo_bq_dev
jaffle_shop_demo_bq_prod
```
の二つを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/f1a2b6ff-bae1-051d-1105-f2ef73234a75.png)
※画像はdev分のみです。

作成できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/069a827f-d318-f48d-fbbc-16278f561c85.png)

次にサービスアカウントの設定です。
利用するプロジェクトの[IAM & Admin] - [Service Accounts]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/c315edaa-03b5-d7f8-418d-4bb970d163e3.png)

[+ CREATE SERVICE ACCOUNT]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/615eb9ac-6907-474c-57b4-9788887f92bf.png)

Service account IDを入力します。
今回は「dbt-service」としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/8b8b8770-ee43-6af4-16c8-1fd000a42631.png)

ロールを付与します。
今回は「Owner」としましたがOwner権限は非常に強いため、留意が必要です。
通常接続には「BigQuery Job User」と「BigQuery Data Editor roles」があれば問題ないかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/ad526d26-863c-fc67-553f-0a4190c459e8.png)

作成されたので、サービスアカウントをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/f938efbe-53c0-4a1c-b10e-31629b09afdf.png)

dbtとの接続設定時に利用するため、サービスアカウントのプライベートキーを作成し、JSON形式でダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/2d54c822-6baf-c3bb-8643-473ed3ad742a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/c6b20a9e-0987-f174-21a6-6527056ed095.png)


# 2. 環境構築
### 2-1. dbt Cloudで新規プロジェクトを作成
dbt Cloudで新規プロジェクトを作成します。
[Account home]から[New project]を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/cdba9e4d-d3ab-3f2b-d891-2de30197fbb0.png)

Project name：Matsuki_jaffle_shop_demo

を入力して[Continue]を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/b8a6e09a-c660-3fcf-1e24-a96e649e3f83.png)


### 2-2. BiqQueryへの接続設定
BigQueryへの接続設定を作成します。
先ほど設定したBigQueryを使うため、[+ Add new connection]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/bb22a652-aa2c-ee95-0d2a-36694789e4cf.png)

[+ new connection]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/fa8a52ca-992d-56ba-ead1-526dbe020f21.png)

BigQueryを選択し、Connection nameを入力したら、[Upload a Serive Account JSON file]をクリックして
先ほど事前準備の際にダウンロードしたサービスアカウントのJSONファイルをアップロードして[Save]します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/85a837d2-85df-83a0-4c4f-408f83f115cd.png)

dbtのプロジェクト作成画面に戻り、作成した接続設定を選択します。
Datasetは作成したものを利用するため、「jaffle_shop_demo_bq_dev」としました。
dbt Cloudのプロジェクトを作成する際、デフォルトで開発環境扱いとなるため、devの方を指定しています。
本番環境の設定については後述します。
[Test Connection]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/c928d446-9188-86ac-b604-0a3f9e5dec04.png)

完了したことを確認して[Save]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/c7028ffc-3629-1ef6-08e9-df8b3230f04c.png)


### 2-3. リポジトリの設定
こちらは一度スキップしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/71dcce61-be0f-b33a-e2c4-039505e312b3.png)

左側メニューの自分のアカウントから、[Your profile]を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/f59ce622-3635-e844-2ad6-88787292ca60.png)

GitHubの[Link]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/bef8177f-1288-9432-dc59-9b7123f3bce2.png)

[Authorize dbt Cloudをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/aacf798d-67be-2574-d42c-bf8f05267c6a.png)

[Configure GitHub Integration]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/954e15d9-3bb5-5a34-83bf-3eb7d7933696.png)

[Install]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/7fc84c9e-f7e7-ca26-4231-a9ae86e2b392.png)

プロジェクト画面の右上[Settings]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/1e1ab12a-8455-2055-ae9c-8044a6f33355.png)

[Configure Repository]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/2878498b-492b-99aa-c54c-1a483ed90990.png)

[GitHub]-[jaffle_shop_demo_bq]を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/ea9b98b2-3a89-0f69-08b8-19806f556b60.png)

Repositoryが設定されればOKです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/659944b1-53d0-cf5f-d425-274aa69870ca.png)


### 2-4. 本番環境の設定
続いて本番環境の設定を行います。
dbt Cloudではデフォルトで作成したプロジェクトはDEV（開発）環境の扱いとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/0a010bcd-365a-c6e2-1374-c2ef81a91379.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/5710d773-3fd2-765b-f1e5-a5092b9ee0dd.png)

PROD環境を設定するために[Create Environment]をクリックします。
Environment nameを入力し、Connectionを選択してDatasetを入力します。
この時入力するDatasetは事前に作成した
```
jaffle_shop_demo_bq_prod
```
です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/280399bb-e2a4-9f7d-59f6-818c75d4e953.png)

[Test Connection]が問題ないことを確認しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/b3337c27-ab76-e011-c02a-f6d5471d8d36.png)

念のため、Your rofileからデフォルトのデータセットを確認しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/c6c7b255-eabb-42b0-f9a5-c25cb45f8d89.png)

Credentialsから先ほど作成したプロジェクトを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/734c49a3-5afd-b97b-6cca-40d5d23854b0.png)

Development credentialsのDatasetが「jaffle_shop_demo_bq_dev」になっていることを確認します。
※もしなっていない場合、Editで変更してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/d91aadb4-6bf3-f867-b41e-6554f87f0b61.png)


# 3. dbt でコマンド実行
ローカル環境になりますが、「Chapter 03 とりあえず、dbtを動かしてみる」以降でjaffle-shopの各モデルと処理内容に付いて丁寧に説明されていますので参照してください。
https://zenn.dev/hananah/books/dd9f6f4e82b5d7/viewer/513587


### 3-1. dbt seed：ソースデータの作成（BigQuery）
dbt seedコマンドを使って、jaffle-shopの架空データを生成します。
まずは左側メニューバーの[Develop]-[Cloud IDE]を選択し、File explorerからdbt_project.ymlを選択して編集しましょう。
dbt_project.ymlはdbt がどのディレクトリを参照するのかや、どのディレクトリへコンパイルした SQL ファイルをアウトプットするのか、といった設定を記述するファイルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/f3c8ad67-a4af-f860-6031-6b14a85d3236.png)

15行目に
```
seed-paths: ["seeds"]
```
とありますので、これを
```
seed-paths: ["seeds", "jaffle-data"]
```
とします。
これでプロジェクトのデータの取り込み元が指定できました。
次に、27~29行目に
```
seeds:
  jaffle_shop:
    +schema: raw
```
とありますので、これを
```
seeds:
  jaffle_shop:
    +schema: jaffle_shop_demo_bq_dev
```
とします。
これでseedコマンド実行時のデータの出力先を作成したデータセット「jaffle_shop_demo_bq_dev」が指定できました。

dbt seedコマンドを入力し、Enterキー押下で実行します。jaffle-dataフォルダ配下のCSVファイルを読み込み、ファイル名をテーブル名としてBigQueryの開発用のDataset「jaffle_shop_demo_bq_dev」に生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/baa7430f-be18-cfa5-3ec8-881cad771c31.png)

logを確認する事で、BigQueryのDataset名が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/e811b3bc-3393-c096-7bd3-bf61fc102b4f.png)

BigQuery上でも確認できます。
※devで実行されているため、prodの方には作成されていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/69b2e791-974f-bfd3-275d-d3201a9b9cb2.png)

データのロードが終了後、後続のコマンド実行時の妨げとなるため、先ほど設定したseed-pathの行と「jaffle-data」フォルダは削除した方が良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/8f447e11-620b-2fc2-8f5d-2678d4cce28e.png)


### 3-2. dbt run：モデルの実行
modelsディレクトリに配置したSQLモデルに従ってデータ加工処理を実行するには、dbt runコマンドを使います。
始めにステージング層が実行され、そのあとにデータマート層が実行されます。
（dbtによってDAGや冪等性を考慮され、実行されます）

dbt runコマンド実行前に、models/staging/__sources.ymlを編集します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/b117868e-d48a-4bf9-a31d-4d1334b144e0.png)


```
sources:
  - name: ecom
    schema: raw
```
を
```
sources:
  - name: ecom
    schema: jaffle_shop_demo_bq_dev
```

に変更しておきます。
編集後にdbt runコマンドを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/e55db925-a95c-7eaa-7210-84eb432d1aef.png)

BigQuery上でも確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/109d448d-6858-28b3-54fe-510f47b5c072.png)

dbt_project.ymlの設定通り、ステージング層はViewで、マート層はTableで作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/6a15f5de-437b-ad8a-53ac-bcb39709000a.png)


### 3-3. dbt test：テストの実行
dbt testコマンドでテストの実行を行うことが出来ます。
テストによって品質の低いデータの混入を検知してアラートしたり、データの品質を保ったりするのに使います。
また他にも開発中のデータの前提条件などを明示的に定義するためにも利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/db88bec1-229c-ada9-7918-d5e98fed2a4d.png)


### 3-4. dbt build：プロジェクトの実行
ここまで3つのコマンドを実行しましたが、それらのコマンドを一括で実行可能なのがdbt buildコマンドです。
都度個別のコマンドの実行が不要なことや、実行順序をdbt側でやってくれるので楽ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/86e3112d-4a8d-e8c0-87de-054b7f146e83.png)


### 3-5. dbt docs generate：ドキュメントを生成
dbt docs generateコマンドで作成したプロジェクトのドキュメントを生成することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/c2f6ee9b-d919-53e6-1265-bc211b1516a1.png)

dbt docs generate実行後、画面をリフレッシュするとdocs viewアイコンが有効になるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/94bb3f5d-7e64-a31a-adc2-25e296af085c.png)

例えば、customersテーブルのドキュメントを表示してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/f983764c-1f78-bd9f-0254-f38a8a60f909.png)

右下のアイコンで linege（リネージュ）が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731094/d21b71a7-4505-d4cc-5c33-93748e869616.png)


# 最後に

dbt Cloudである程度の基本的な機能を検証してみました。
いかがでしたでしょうか。
次回は本番環境の設定についてもう少し触れていきたいと思います。
今後も検証した内容についてまとめて発信していきたいと思いますので、よろしくお願いいたします。