この記事は GRIPHONE Advent Calendar 2022 16日目の記事になります。
この前、嵯峨野観光鉄道のトロッコ列車に乗ってお尻の痛みと引き換えに紅葉を楽しんだデータエンジニアの吉永です。
今年の8月に、dataformがついにGCPでpreviewになったので、
今更ではありますが、いろいろ試してみましたので、その簡単なご紹介をさせていただきます。
dataformってなに?
詳しいことはこちらに書いてありますが、https://cloud.google.com/dataform/docs/overview
簡単に説明させていただくと、
dataformはBigQuery上のデータを変換するにあたって、
変換ワークフローの開発・テスト・バージョン管理・スケジュール管理が出来るツールです。
今までは、dbtを使用して変換をしていたり、ScheduledQueryを使用して変換したり、
GCP外のツールや、はたまた管理しきれないScheduledQueryに陥ってしまうことがあったりしたかもしれませんが、
dataformを利用することによってGCP内で依存関係も含めてコード管理ができるようになりました。
ScheduledQueryと比較すると、依存関係が管理できなかったので、
万が一のことがあると手でリトライしなければならなかったりと、
苦労する部分があったと思います。
そんなdataformを試しに使ってみようと思います。
とにかく使ってみよう
書き連ねていてもよくわからないので、実際にポチポチ手を進めていきます。

まずは、リポジトリを作成します。

リージョンはまだ2つしか選択できませんが、ここではusで進めます。

リポジトリが出来上がりました。ここで、dataform用のサービスアカウントに関するお話がありますね。
Dataform は、サービス アカウント service-xxxxxxxxxxxx@gcp-sa-dataform.iam.gserviceaccount.com としてワークフローを実行します。
データセット、テーブル、ジョブを作成するために、サービス アカウントにロール roles/bigquery.user が付与されていることを確認します。
また、ワークフローで使用するデータセットまたはテーブルを読み取るためのアクセス権が、サービス アカウントに付与されていることも確認してください。詳細

ひとまず、IAMでサクッと必要そうな権限を付けておきます。

最初の開発ワークスペース
開発ワークスペースには、チームのリポジトリの編集可能なコピーが含まれます。開発ワークスペースを使用すると、他のユーザーに影響を与えることなくコードを開発し、変更を commit して、リモートの Git リポジトリに commit を push できます。
さて、先ほど作成したリポジトリに戻りまして、こちらで、専用のワークスペースを作りましょう。


そのまま進めてみます。


とりあえず、VeiwTableが2つできました!
ひとまず、できたテーブルを確認してみましょう。

Viewテーブルが生成されました🎉
せっかくなので、少しデータを変えてみましょう。
適当なテーブルを2つ用意します。
京都のお寺3つ、奈良のお寺3つのテーブルと、その2つのテーブルをUNIONしたViewテーブルを作ってみます。
/definitions/temple_kyoto.sqlx
config {
type: "table",
columns: {
name: "temple name",
}
}
SELECT "清水寺" AS name UNION ALL
SELECT "銀閣寺" AS name UNION ALL
SELECT "金閣寺" AS name
/definitions/temple_nara.sqlx
config {
type: "table",
columns: {
name: "temple name",
}
}
SELECT "東大寺" AS name UNION ALL
SELECT "法隆寺" AS name UNION ALL
SELECT "長谷寺" AS name
/definitions/temple.sqlx
config {
type: "view",
columns: {
test: "A description for the test column", // Column descriptions are pushed to BigQuery.
}
}
SELECT * FROM ${ref("temple_kyoto")}
UNION ALL
SELECT * FROM ${ref("temple_nara")}
用意したコードはこんな感じです。

実行してみたところ、無事にテーブルが作成されました。

どうやら、先ほど作成したサンプルが消えることはないようですね。テーブル2つとビューが1つ作成されたことが確認できました。

試しにtemple viewに対してクエリを書いたところ、無事に望む結果になりました。
まとめると
dataformを用いることによって、GCPデータの変換を完結させることができました。
現在のGCPのdataformでは、まだ定期実行や開発・本番環境の設定やクエリのプレビューなどはなさそうなので、
今後のアップデートに期待ですね。