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

# はじめに

こんにちは、京セラコミュニケーションシステム　西田（@kccs_hiromi-nishida）です。

最近ストアドプロシージャを作成し、それをCloud Functionsからキックして、Cloud Functions自体はCloud Composerでジョブ制御する、という要件がある案件を少し手伝いました。

もう少しスマートに出来ないものかなぁと思っていたところ、上司からBigQueryならこんなプロダクトあるよ！と紹介されたのが、Dataformです。

ちょっと調べてみるとなかなか便利そう！
前編では概要の紹介と使用するまでの準備、中編では実際にDataformを使ってみる、後編ではワークフローのテストや定期実行をしてみる、という3部構成の記事にする予定です。

:::note warn
本記事は2023年7月ごろに作成しております。よって、引用している文章などはこの時点での最新となります。ご了承ください。
:::

## 連載記事一覧

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

## この記事の対象者

* Dataformって何それ？と思っている方
* Dataformを使ってみたいなと思っている方

## そもそもDataformって何？

公式ドキュメントの冒頭には以下のように記載されています。
>データアナリストがBigQueryでデータ変換を行う複雑なSQLワークフローを開発、テスト、バージョン管理、スケジュール設定するためのサービスです。
Dataformを使用すると、データ統合のELT（抽出、読み込み、変換）プロセスにおけるデータ変換を管理できます。
--[*Dataform の概要*](https://cloud.google.com/dataform/docs/overview?hl=ja "Dataform の概要") より抜粋

主な特徴は以下の通りです。
* SQLXというSQLに似た言語でテーブルの定義や集計処理等のロジックを記述できる

* JavaScriptをSQLXファイル内で使用できる（処理の共通化や繰り返し処理、変数定義等）

* SQLXファイル内に検証ロジックを記述することで検証処理が実行できる

* BigQueryのコンソールから依存関係の可視化やエラー取得、Gitによるコードのバージョン管理が行える

* データウェアハウスとして、Snowflake、Google BigQuery、Amazon Redshift、Azure SQL Data Warehouse、Postgresをサポート

2023年5月にGAとなった比較的新しいサービスとなります。
無料で使うことができる[^1]のも嬉しいポイントですね。

## 従来のデータ変換

BigQueryにとりあえず色々なデータを集めてきて、さぁ可視化や分析をしたい！と思った場合、最終的に利用したいデータ形式に合わせてさまざまなデータマートを作成していくと思います。

単純な場合はいいのですが、たとえば以下のようにTable_Gの前にTable_CとFが集計されている必要があり、Table_Cの前にTable_BとEが集計されている必要があって・・（続く）というような依存関係のあるマートの場合があったとします。
この場合、依存関係を管理するためにGoogleのプロダクトだとCloud Composer[^2]やWorkflows[^3]等のサービスを使うことがあったのではないでしょうか。
![mart](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/18f47ab0-d5ec-8830-9dfe-5bef89ea61b0.png)
これらはもちろん素晴らしいプロダクトなのですが、DAGの記述方法（pythonで書かないといけない）を覚えたり、プログラムが複雑になったりなど、気軽に使ってみるにはちょっと難しく敷居が高いかな？という印象です。（個人的に）

ちなみにDAGのサンプルが公式ドキュメントにありますので、見てみてください。
結構複雑だなぁという印象を持たれる方、多いのではないでしょうか。

https://cloud.google.com/composer/docs/data-analytics-googlecloud?hl=ja#data_analytics_dag

## Dataformを使うとどうなるんだろう？

Dataformで依存関係を定義しようとした場合、使われるのがSQLXというSQLの拡張言語です。
公式ドキュメントのサンプルを見て頂ければわかるのですが、SQLを書いたことがあれば、ほぼ内容を理解できるのではないかと思います。

サンプルコードに、`ref('order_stats')`という記述があります。
このref関数を使うことで自動的にテーブルの依存関係が追加されます。
つまり、今回のサンプルだと`order_stats <- サンプルで作成されるテーブル`という依存関係が自動で定義され、DAGが作成されます。

中編ではこの依存関係の定義などもより詳しく説明する予定です！

```SQL:サンプル（公式ドキュメントより転載）
config { type: "table" }
SELECT
  customers.id AS id,
  customers.first_name AS first_name,
  customers.last_name AS last_name,
  customers.email AS email,
  customers.country AS country,
  COUNT(orders.id) AS order_count,
  SUM(orders.amount) AS total_spent
FROM
  dataform-samples.dataform_sample.crm_customers AS customers
  LEFT JOIN ${ref('order_stats')} orders
    ON customers.id = orders.customer_id

WHERE
  customers.id IS NOT NULL
  AND customers.first_name <> 'Internal account'
  AND country IN ('UK', 'US', 'FR', 'ES', 'NG', 'JP')

GROUP BY 1, 2, 3, 4, 5

```

--[*テーブルの構造と依存関係を定義する*](https://cloud.google.com/dataform/docs/define-table?hl=ja#define_table_structure_and_dependencies "テーブルの構造と依存関係を定義する") より転載

## 使うための準備をしよう

では、中編に向けてまずはDataformを使うための準備をしたいと思います。

### APIの有効化

ハンバーガーメニューを開き、BigQuery → Dataformを選択します。

<img width="300" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/5aaab849-c340-a8ec-ec02-8d6a927f92fd.png">

<font color="DarkGray">_Google Cloud メニュー画面_</font>

表示された画面で、`有効にする` を選択すればOKです。

<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/e71dd0f7-3a0f-f469-5758-956b3b376f2b.png">

<font color="DarkGray">_Dataform API有効化画面_</font>

### 必要なロール

Googleアカウントに以下のロールを付与してください。

| ロール名        | ロールID               | 説明                                                                             | 
| --------------- | ---------------------- | -------------------------------------------------------------------------------- | 
| Dataform 管理者 | roles/dataform.admin   | すべての Dataform リソースに対する完全アクセス権                               | 
| Dataform 編集者 | roles/dataform.editor	 | ワークスペースに対する編集アクセス権とリポジトリに対する読み取り専用アクセス権 | 

### リポジトリの作成

※この章で使用している画像はすべてDataform画面をキャプチャしたものとなります

Dataformでワークフローを開発するときにまず作成するのがリポジトリです。
BigQueryメニューからDataformを選択し、`リポジトリ作成` を選択してください。

<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/ef4c9ac9-fe39-2931-49a4-2e03b163d68a.png">

リポジトリIDを入力、リージョンを選択して `作成` を選択してください。
<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/e31938c6-c772-5e18-c2b4-2351dec59d51.png">

リポジトリを作成すると、自動的にDataform用のサービスアカウントが作成されます。
画面に記載されているとおり、BigQueryのワークフローを実行するためにはロールが必要なので、後ほどこの自動作成されたサービスカウントにロールを付与します。

※サービスアカウントIDをコピーしておくとロール付与の際に便利です！

`完了` を選択し、リポジトリの作成はこれで完了です。

<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/035f297c-4b49-2af3-7abd-7312b6fc6544.png">

### BigQueryへのアクセス権を付与

リポジトリを作成すると自動作成されるサービスアカウントに対し、BigQueryへのアクセス権を付与します。
以下の公式ドキュメントに付与するロールが記載されているのでその通り付与します。

https://cloud.google.com/dataform/docs/required-access?hl=ja#grant_your_service_account_the_required_roles

IAMと管理→IAMを選択し、`アクセス権を付与` を選択します。

<img width="400" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/dd3867d2-6f83-8cf4-8c6a-ac2dcc492ebb.png">

<font color="DarkGray">_IAMと管理画面_</font>

新しいプリンシパルに、自動作成されたDataformのサービスアカウントIDを入力します。
※前の章でサービスアカウントIDをコピーしておくと、ここで貼り付けできて便利です。

ロールは公式ドキュメント記載通り3つ追加し、最後に `保存` を選択して付与は完了です。

<img width="400" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/392286fc-7ba8-670c-8f00-0596080099ab.png">

<font color="DarkGray">_IAMと管理 アクセス権付与画面_</font>

### 開発ワークスペースの作成

開発ワークスペースとは、Gitでいうとブランチのような位置づけです。

共同開発の場合、開発者がそれぞれGitでブランチを切って開発しますが、それと同じようにDataformではワークスペースを開発者がそれぞれ作成することで作業スペースを分けることができ、他のメンバーに影響を与えることなく変更内容をリポジトリにcommit/pushできるようになります。

前の章で作成したリポジトリにはまだワークスペースがないので、ここでワークスペースを作成します。

※この章で使用している画像はすべてDataform画面をキャプチャしたものとなります

BigQuery→Dataformと選択し、作成したリポジトリを選択します。

<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/f1972a94-ed15-3609-a87a-a8303b2b1150.png">

`開発ワークスペースを作成` を選択します。
<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/864d68b7-3223-fa3f-1a6c-2d7e577c0880.png">
ワークスペースIDを入力し、`作成` を選択します。
<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/d0e7641e-9142-09a2-e7cc-c0ccc249a791.png">
ワークスペースが作成されました！
<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/07f6276f-5321-613c-53d0-a9bd8565d756.png">
作成したワークスペースIDを選択して、ワークスペースの初期化を行います。
`ワークスペースを初期化` を選択してください。

<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/bdde6c3b-fef6-bc9f-799b-a4da342141df.png">

しばらくすると初期化が完了し、最初のViewを作成するためのSQLXファイルが表示されます。

<img width="400" alt="Dataform" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752159/133133ac-93ec-0be6-a704-f72f155c0398.png">

これで準備は完了です！

## 次回予告

前編ではDataformの概要の説明、使用するまでの準備についての内容をお届けしました。
中編では以下のような内容を紹介する記事を作成する予定ですので、お楽しみに。


* テーブルを作成してみよう
* 作成したテーブル同士で依存関係を作成してみよう

※記事作成中に変更になる可能性はあります。ご了承ください！

[^1]:Dataformの利用自体は無料ですが、BigQueryでのクエリ実行や他のサービスを連携して利用する場合、利用したリソースに対する課金は発生します。
[^2]:[Cloud Composer の概要](https://cloud.google.com/composer/docs/concepts/overview?hl=ja "Cloud Composer の概要") -- 公式ドキュメント
[^3]:[ワークフローの概要](https://cloud.google.com/workflows/docs/overview?hl=ja "ワークフローの概要") -- 公式ドキュメント