Dataformって何？便利そうだし調べてみた！（後編）

# はじめに

こんにちは、京セラコミュニケーションシステム　西田（@kccs_hiromi-nishida）です。
前編記事で、Dataformの概要とDataformを使うまでの準備について、中編では実際に簡単なデータパイプラインを作ってみました。

後編では、テストや定期実行に関して紹介します！

:::note warn
本記事は2023年9月ごろに作成しております。よって、引用している文章などはこの時点での最新となります。ご了承ください。
また、特別な記載のない限り画像はBigQuery（Dataform）の画面をキャプチャしたものとなります。
:::

## 連載記事一覧

[Dataformって何？便利そうだし調べてみた！（前編）](https://qiita.com/kccs_hiromi-nishida/items/28be115f44c16fb077a4 "Dataformって何？便利そうだし調べてみた！（前編）")
[Dataformって何？便利そうだし調べてみた！（中編）](https://qiita.com/kccs_hiromi-nishida/items/ea6bb6835f938dcc3f02 "Dataformって何？便利そうだし調べてみた！（中編）")
Dataformって何？便利そうだし調べてみた！（後編）　<font color="Tomato">★本記事★</font>

## Dataformのテスト

Dataformではassertionsオプションを使ってデータのテストし、問題のあるデータを検知できます。
assertionsオプションは、中編記事でも紹介したSQLXファイルのconfigブロック内に定義するだけで、とても簡単に使うことができます。

代表的なassertionsオプションは以下の通りです！

### nonNull

指定した列のすべての値がNULLでないことをチェックします。

```sql:sample.sqlx
config {
  type: "table",
  assertions: {
    nonNull: ["user_id", "customer_id", "email"]
  }
}
SELECT ...
```

### uniqueKey

指定した項目の値がユニーク（重複していない）であることをチェックします。

```sql:sample.sqlx
config {
  type: "table",
  assertions: {
    uniqueKey: ["user_id"]
  }
}
SELECT ...
```

### uniqueKeys

指定した複数項目のすべての値がユニーク（重複していない）であることをチェックします。

```sql:sample.sqlx
config {
  type: "table",
  assertions: {
    uniqueKeys: [["user_id"], ["signup_date", "customer_id"]]
  }
}
SELECT ...
```

### rowConditions

指定した項目の値が、定義しているカスタムロジックにしたがっているかをチェックします。
正規表現も使えるので文字列に対する制約をかけるときに重宝しそうです。

```sql:sample.sqlx
config {
  type: "incremental",
  assertions: {
    rowConditions: [
      'signup_date is null or signup_date > "2022-08-01"',
      'email like "%@%.%"'
    ]
  }
}
SELECT ...
```

### その他のassertions

上記4つのassertions以外にも

* 自作のアサーションを定義する
* アサーションを依存関係として追加する

というようなこともできます。
詳しくは公式のドキュメントをご確認ください！

https://cloud.google.com/dataform/docs/assertions?hl=ja#manual


### assertion結果の確認方法

アサーション結果の確認方法は、2つあります。

#### 1.実行ログから確認

BigQuery→Dataformと選択し、リポジトリを選択して`WORKFLOW EXECUTION LOGS`を選択すると、実行ログを確認できます。
<img width="600" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/72e13434-0d8d-c1fd-58e4-78391ddfb65e.png">
エラーになっている開始時間のリンクを選択すると、詳細を確認できます。
<img width="600" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/0d0f065a-dd59-9038-607c-a78429cf1c72.png">

#### 2.テスト結果が保存されるテーブルを確認

テスト結果は自動的にBigQueryにデータセットが作成され、Viewとして保存されます。
Viewを確認することで、何が検知されたかわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/2f0a3d69-b605-443e-5da3-9cc9dc777d16.png)
`dataform_assertions`というデータセットの下にテーブルができているので、Viewに対してクエリを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/fa019982-e50b-2ad0-996c-e08ea2dc2866.png)
結果を確認すると、customer_idはNOT NULLの条件が設定されているのに、値がnullになっていることからデータ違反として検知されたことがわかります。

## Dataformの定期実行

Dataformのワークフローを定期実行させたい場合、Cloud SchedulerやCloud Composerを使うこともできますが、Dataformだけで完結するような簡単なデータパイプラインの場合は`ワークフロー構成`で実行をスケジューリングする方法がシンプルで簡単だと思います。

Cloud SchedulerやCloud Composerを使用する方法に興味のある方は公式ドキュメントを参照してください。

https://cloud.google.com/dataform/docs/schedule-executions-workflows?hl=ja

https://cloud.google.com/dataform/docs/schedule-executions-composer?hl=ja


### リポジトリへ変更を反映（コミット）する

リリース構成の作成やワークフロー構成の作成は、リポジトリに変更がコミットされていることが前提となります。
前編で[開発ワークスペースの作成](https://qiita.com/kccs_hiromi-nishida/items/28be115f44c16fb077a4#%E9%96%8B%E7%99%BA%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90 "前編記事")を行い、中編ではその作成したワークスペースにSQLXファイルを作成しましたが、作成しただけだとリポジトリに変更がコミットされていないため、変更をコミットする必要があります。

<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/6d5e4dfa-8dc5-d656-7bb7-c24137920b83.png">

ワークスペースに`〇件の変更をCOMMIT`と表示されている場合、その件数のコミットがまだリポジトリに行えてないということになるので、コミットしておきましょう。

この場合だと、`4件の変更をCOMMIT`という部分を選択します。
コミットメッセージを入力し、`すべてのファイルをCOMMIT`を選択してください。

<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/b78dee21-b4da-dfc3-9763-7d743eb636a0.png">

すると、`PUSH TO DEFAULT BRANCH`という表示に切り替わるので、選択します。
<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/52a404b3-c25a-ac3f-e3bf-36916410fa4f.png">
`ワークスペースは最新の状態`という表示になればOKです。
<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/78affa29-1f51-0621-8a2d-d1ba14c627e5.png">

### リリース構成を作成する

ワークフローの定期実行を行う設定をする前に、リリース構成を作成する必要があるので作成します。

Dataformのリポジトリを選択し、`RELEASE CONFIGURATIONS`を選択します。

<img width="600" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/e8c242d6-96e1-465f-fc80-26b327c11bc4.png">

`新しいリリースの構成`を選択します。
<img width="600" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/3480e056-6cce-8221-ce30-c58213adc4f4.png">
リリースIDを入力し、頻度は`なし`とします。
その他の項目は今回は入力・設定の必要はないので、このまま`作成`を選択します。

<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/ea82d899-2813-68f6-20f3-198ca7c781b4.png">

リリース設定が作成されました。
<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/fcdc9aeb-2988-41a8-5b9f-f267a7f64427.png">

### ワークフロー構成の作成

次に、ワークフロー構成の作成を行います。
Dataformのリポジトリを選択し、`WORKFLOW CONFIGURATIONS`を選択し、`新しいワークフロー構成`を選択します。
<img width="600" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/e1e46f96-f3d0-2ec8-cc48-663f59f8c33e.png">
構成IDを入力し、リリース構成は先ほど作成したリリース構成を選択します。
サービスアカウントは今回はデフォルトのサービスアカウントを選択しました。
<img width="500" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/554b57ce-e8f4-f989-9b1c-ab3ae4437d8b.png">
頻度は、Cron形式での指定となります。
この例だと、毎日午前12時の実行指定になります。他にもさまざまな指定方法があるので、公式ドキュメントを確認し、実行したい頻度の指定を行ってください。

https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules?hl=ja&_ga=2.241700738.-1626482770.1692752015#defining_the_job_schedule

最後に実行するアクションの指定を行います。
* ALL ACTIONS
　すべてのアクションを実行
* SELECTION OF ACTIONS
　実行するアクションを選択して実行
* SELECTION OF TAGS
　実行するタグを選択して実行

※タグに関しては今回の連載記事では触れていませんが、SQLXファイルを作成する際にconfigブロック内にタグの指定をすることで、タグ単位でのアクション実行を行うことが可能です。

https://cloud.google.com/dataform/docs/tags?hl=ja

作成を選択すると、スケジュールが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/5f27017c-cd00-24ee-3148-ca6508baf981.png)
実行結果は、`WORKFLOW EXECUTION LOGS`で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/f20d4466-675e-766d-4d70-f0fe11386109.png)

## おわりに

前編・中編・後編とDataformに関して紹介しました。
いかがでしたか？
私も今回はじめてDataformを使ったのですが、SQLを書くことができれば、ほとんど苦労することなく使えるサービスだと感じました！

今回連載で紹介した内容以外にも、Dataformにはさまざまな機能があります。
興味がある方はぜひ公式ドキュメントも確認してみてくださいね。

https://cloud.google.com/dataform/docs/guides?hl=ja