Google CloudのDataformでBigQueryにテーブルを作成してみた

DataformでBigQueryにテーブル・ビュー・マテリアライズドビューを作成してみました。テーブルとカラムに説明をつけるための設定も確認しました。
2023.04.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の鈴木です。

Google CloudのDataformでBigQueryにテーブルを作成してみたので、試したことをまとめました。

Dataformは記事執筆時点ではプレビュー版で、この記事もプレビュー版について記載しています。先立って試してみたい方の参考になりましたら幸いです。

Dataformとは

SQLを使用してBigQueryでスケーラブルなデータ変換パイプラインを開発・運用できるサービスです。 製品紹介ページは以下になります。

主な機能として、以下の3点が紹介されています。

  • データ変換を管理するためのオープンソースのSQLベースの言語Overview of Dataform coreに記載がありますが、オープンソースのソフトウエアのDataform Coreを使うことで、テーブル定義の一元的な作成や依存関係の構成など、さまざまな機能をSQLを使用して実現できます。

  • データパイプラインのフルマネージドサーバーレスオーケストレーション:SQLワークフローを手動およびほかのサービスによりトリガーすることで、最新バージョンのコードを使用してテーブルを更新することができます。

  • SQLで開発を行うための多機能のクラウド開発環境:ウェブブラウザからテーブルの定義・リアルタイムのエラーメッセージに関する問題の修正・依存関係の可視化・Gitへの変更のcommitなどを行えます。

検証の概要

今回は以下の3点を確認しました。

  • Dataformのリポジトリ・ワークスペースを作成する。
  • BigQueryのデータセットにテーブル・ビュー・マテリアライズドビューを作成する。
  • テーブルに説明をつける。

参考にしたのは以下の3つのガイドです。

やってみる

リポジトリの作成

まずはQuickstart: Create and execute a SQL workflow in Dataformを参考に、ワークスペースの作成までを行いました。

作業用のGoogleCloudプロジェクトに切り替えた状態で、ドキュメントのBefore you beginEnable the BigQuery and Dataform APIs.Enable the APIsボタンをクリックし、ガイドに従ってAPIを有効化しました。

APIの有効化

APIの有効化2

APIの有効化3

また、IAMと管理IAMから、自分が作業するユーザーに以下の権限があることを確認しました。

  • Dataform Admin (roles/dataform.admin) :レポジトリ向け
  • Dataform Editor (roles/dataform.editor) :ワークスペース・ワークフロー実行向け

早速リポジトリを作ってみました。BigQueryのコンソールにて、Dataformを左側のメニューからクリックし、Dataformの画面から+リポジトリを作成を押しました。

リポジトリを作成1

リポジトリIDはquickstart-repositoryとし、リージョンはasia-northeast1としました。

リポジトリを作成2

作成を押すと、リポジトリを作成しましたというメッセージが表示されます。このとき、Dataformがワークフローを実行するサービスアカウントがなにか表示されます。これは後で設定時に必要なので覚えておきましょう。

ちなみに忘れてしまった場合も、DataformのサービスアカウントIDはGrant Dataform access to BigQueryに記載されているので心配要りません。

リポジトリができたら、リポジトリの一覧から作成したリポジトリをクリックします。

リポジトリをクリック

ワークスペースの作成

次に、ワークスペースを作成します。ワークスペースについては、Introduction to developing in a workspaceに説明があります。ブランチのような、チームのリポジトリの編集可能なコピーにアクセスできる機能で、ほかのユーザーに影響を与えずコードを開発し、commitしたものをリポジトリにpushできます。コード編集だけでなく、SQLで定義したワークフローのグラフ表示の確認や、ワークフローの実行もできます。

CREATE DEVELOPMENT WORKSPACEをクリックし、ワークスペースを作成します。

ワークスペースを作成1

開発ワークスペースを作成が開くので、ワークスペースIDを入力し、作成します。今回はquickstart-workspaceとしました。

ワークスペースを作成2

以下のようにワークスペースが作成されました。

ワークスペースを作成3

今回はまっさらのリポジトリに新しくワークスペースを作成したので、ワークスペースの初期化をしておきます。ワークスペースを初期化をクリックします。

ワークスペースを初期化

以下のように初期プロジェクトが準備されました。

初期化したワークスペース

試しに、6件の変更をCOMMITを押すと、以下のようにコミットを作成することが可能できました。

新規commit

SQLによる定義の作成

まず、QuickStartに沿って、データソースとなるquickstart-source.sqlxと、quickstart-table.sqlxを作成しました。

quickstart-source.sqlxは、definitionsのメニューからファイルを作成を押すと、ファイル名を指定してファイルが作成できました。

quickstart-source.sqlxの作成

quickstart-source.sqlxに、以下のようにビューを作成する定義を記載しました。

quickstart-source.sqlxの作成2

definitions/quickstart-source.sqlx

config {
    type: "view"
}

SELECT
  "apples" AS fruit,
  2 as count
UNION ALL
SELECT
  "oranges" AS fruit,
  5 as count
UNION ALL
SELECT
  "pears" AS fruit,
  1 as count
UNION ALL
SELECT
  "bananas" AS fruit,
  0 as count

また、quickstart-table.sqlxも作成しました。

quickstart-table.sqlx

definitions/quickstart-table.sqlx

config {
    type: "table"
}

SELECT
    fruit,
    SUM(count) as count
FROM ${ref("quickstart-source")}
GROUP BY 1

編集し、コミットしていないファイルについては、ファイル名の左側に*が付くようです。

サービスアカウントへのアクセス権限追加

IAMと管理アクセス件の付与から、アクセス権の付与を行いました。

Dataform用のサービスアカウント設定

リポジトリ作成時に記載があったサービスアカウントIDを新しいプリンシパルに入力しました。ロールに、BigQueryデータ編集者BigQueryデータ閲覧者BigQueryジョブユーザーを追加し、保存しました。

Dataform用のサービスアカウント設定2

アクションの実行

Dataformの画面に戻り、実行を開始からすべてのアクションを押しました。

実行1

ALL ACTIONSから、実行を開始を押しました。

実行2

以下のように、BigQueryにリソースが作成されました。

実行3

EXECUTIONSタブから実行履歴が確認できます。今回は成功したのでBigQueryにリソースが作成されていましたが、もしできていなかったり、結果が不安な場合は、こちらをみるとよいです。

EXECUTIONSタブ

実行結果

マテリアライズドビューの作成

これまでの操作でテーブルとビューを作成しましたが、マテリアライズドビューも作成してみます。

マテリアライズドビューの定義については、Create a tableに例があったので試してみました。

以下のようにquickstart-materialized-view.sqlxを作成しました。

definitions/quickstart-materialized-view.sqlx

config {
    type: "view",
    materialized: true
}

SELECT
    fruit,
    count
FROM ${ref("quickstart-table")}

quickstart-materialized-view.sqlx

ところで、ここでコンパイルされたワークフローを確認してみました。

COMPILED GRAPHタブから確認ができました。

コンパイルされたワークフロー

今度は個別にアクションを実行してみました。quickstart-materialized-view.sqlxを開いた状態で、SELECTION OF ACTIONSから実行しました。

個別のアクション実行

以下のように作成されました。

マテリアライズドビューの作成

既存リソースの更新

データソースとなるビューについて、定義を更新してみました。以下のようにquickstart-source.sqlxを修正しました。右上に実行ボタンがあるので押してみたところ、クエリ結果が表示されました。ただしこれだけではBigQuery側には反映されていませんでした。

ビューの更新

アクションを個別に実行することで、BigQuery側にも定義が反映されました。

BigQuery側への定義の反映

テーブル・カラムへの説明の設定

Add table documentationを参考に、テーブルとカラムに説明を付けてみました。

SQLXテーブル定義ファイルのconfigブロックに、descriptionを追加することで、テーブルに説明を付けることができます。また、columns: {}を追加することで、カラムに説明を付けることもできます。

説明の設定

実行すると、テーブルの説明が付けられていることが確認できました。

説明が設定されたテーブル

カラムにも説明が付いています。

カラムへの説明

最後に

Google CloudのDataformでBigQueryにテーブルを作成してみたので、試したことをまとめました。

レポジトリを使って、チームでテーブル定義ファイルの開発ができますし、依存関係のグラフも可視化してくれるのでテーブル間の関係性が分かりやすくとても便利でした。

今回は基本的な機能を中心に試してみましたが、ドキュメントを読みつつ、ほかの機能も試してみたいと思います。