【Google Cloud】Bigqueryに組み込まれたDataformとはどのようなサービスなのか？

## はじめに
こんにちわ。
気づけばいつの間にかDataformがBigqueryのサービスとしてローンチされていました。
Googleによる買収後少しだけ触ってみたことはあるのですが、Bigqueryの一部となったということで改めてドキュメントを読んだ内容を纏めてみます。
※サービスを細かく検証していないので間違った記載があった場合は申し訳ございません
※以下はBigueryの一部としてのDataformの内容となります

## Dataformとはどのようなサービスなのか？
ETL・ELT処理のT（トランスフォーム）部分を開発•管理できるサービスです。
Bigueryと組み合わせて利用します。SQLでのデータ変換とSQL実行の依存関係をDataformで定義することでトランスフォーム処理を実装します。
例えば、Aテーブルの作成後Bテーブルを作成するといった内容をSQLで定義することが可能です。複数のSQL処理を組み合わせることで、データ更新ワークフローを構築します。ワークフローを実行すると定義されたSQLがBigqueryで実行されます。
必要に応じてSQLではなくJavascriptでの実装も可能です。

## Dataformはどこで利用するサービスなのか？
Bigqueryでの利用となります。
Dataformでは実行するSQL•SQL間の依存関係•その他メタ情報の管理のみの為、SQLを具体的に実行するBigqueryが必要となります。
Dataformとgithub•gitlabを接続することで各種定義ファイルをgitで管理することや、効率的な共同開発が可能です。

## Dataformはいつ利用する（実行できる）サービスなのか？
Dataformで定義したワークフローは、GUI上からの手動実行とAPIでの実行が可能です。スケジュール実行が可能な外部サービスからAPIを実行することで定期実行も可能です。2023/3/26日現在ではDataform単独ではスケジュール実行が(恐らく)できません。定期的なETL処理を実行したい場合、外部サービスとの連携が必須となります。公式ドキュメントでは以下の２パターンのスケジュール実行方法が記載されています。

- [WorkflowsとCloud Schedulerを使用する方法](https://cloud.google.com/dataform/docs/schedule-executions-workflows)
- [Cloud Composerを使用する方法](https://cloud.google.com/dataform/docs/schedule-executions-composer)

## Dataformは誰が利用するサービスなのか？
SQL（またはJavascript）を記載できるデータ利用者全員が活用できるサービスです。DataformはSQLで簡単にワークフロー定義が可能です。その為、データエンジニア以外のユーザーにも簡単に（学習コスト低で）展開可能と思います。その点が最大の魅力です。

## Dataformをなぜ利用するのか？
繰り返しになりますが、SQLでデータ更新ワークフローを定義できることが最大の魅力です。
SQLは比較的利用ユーザーが多く、学習コストも低いです（と思います）。SQLを最大限活かせる環境•人材がある場合、Dataform導入の検討価値があると思います。

- ETL(トランスフォーム)をSQLで処理したい
    - Bigquery利用にあたりETLをSQLで処理したい
    - 現状ETL専用サービスを利用しているがSQLの（Bigqueryでの）処理に移行したい
    - ETLサービスと併用して一部の処理をSQLに移行したい
    - Airflow等のワークフロー管理サービスでSQL実行を行なっているが、SQL実行を専用サービスに移行したい
    - SQLが単純なスケジューラーで実行されており、各テーブルの依存関係等を可視化•一元管理したい

- データ基盤チーム（情シス）とは別にデータマネジメントチームやエンドユーザーが自主的にデータ更新を実施したい
    - データ活用をデータ基盤チーム（情シス）からデータマネジメントチームやエンドユーザーに移行したい
    - エンドユーザーが自主的にデータ作成を実施することでデータ活用の速度を上げたい

## Dataformはどのように利用するサービスなのか？
詳細は[公式チュートリアル](https://cloud.google.com/dataform/docs/quickstart-create-workflow)をご確認ください。
以下がざっくりとした作業イメージとなります。

- IAMでDataform利用ユーザーへ必要な権限を設定する。
    - Dataformで利用するサービスアカウントへの権限設定も必要。
- Dataformにてリポジトリを作成する
- Dataformにてワークスペースを作成する
    - ワークスペースはgit管理されたクラウド上の作業スペース
- 必要に応じてgithub、gitlab連携を設定する
    - 各リモートリポジトリへのアクセスに利用するトークンをSecret managerに登録する
- DataformにてSQL•依存関係の定義(ワークフロー定義)を作成する
    - テーブル、ビューの作成•更新を定義する
        - テーブルやカラムのコメント等の定義も可能
        - テーブル作成前後にセットで実行されるSQLも定義可能
            - UDF作成やテーブルへの権限付与等に使用
    - ソーステーブルを登録する
        - データソースとして利用する（Dataformで作成されない）テーブルの登録が可能
    - テーブル、ビュー作成以外のSQL実行を定義する
        - Insert、Delete等のDMLの実行が可能
        - Create model文やAlter文等、BigqueryのSQL全てが実行可能かどうかは未確認
        - SQLが全て実行可能な場合、以下も可能になるかもしれない（但しベストかどうかは不明）
            - GCSにデータファイル格納後、Load文をDataformから実行することでデータロード以降のETL処理を全てDataformで実装する
            - select文でリモート関数を呼び出すことでBigquery単体では出来ないデータ処理をDataformで実装する（リモート関数の実装は別途必要）
            - Create model文を組み合わせることで、データ作成からmodel作成までのBigquery ML処理をDataformで実装する
    - データ品質を担保するアサーションを定義
- ワークフロー定義を実行する
    - ワークフローを定期実行する為に外部サービスからスケジュール実行する（Dataform APIを呼び出す）


## 終わりに
SQLで簡単にデータ更新ワークフローを定義できるのは非常に魅力的です。
GCSまでデータファイルを連携できる場合でしたら、ETLを外出しせずに（Extract処理は除く）Bigqueryで完結させるのも一つの方法だと思います。また、データマート作成のみエンドユーザー（データマネジメントチーム）に移行する際にDataformを利用するのも現実的な選択肢だと思いました。
Bigqueryはサーバーレスでリソース管理が不要なのでETL含めより楽に管理•運用が可能です（リソース・コストともに勿論限界はあります）。
Dataformの活用シーンは多々あると思うので私も色々と触って試してみたいと思います。
ここまで読んで頂きありがとうございます！

## 参照
公式ページ

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

pythonの公式ライブラリもあるみたいです。外部からのAPI連携もやりやすくなりますね。

https://cloud.google.com/python/docs/reference/dataform/latest

Airflowのoperatorも準備されております。ありがたや。

https://airflow.apache.org/docs/apache-airflow-providers-google/stable/operators/cloud/dataform.html