こんにちは!KIYONOのエンジニアです。
本記事では、Google Cloud Platformの分析サービスであるDataformの入門編として、クエリを実行するまでの基本的な操作の解説をしていきます。
Dataform
Dataformは、Google Cloud Platform(GCP)のサービスの一つであり、“BigQuery でデータ変換を行う複雑な SQL ワークフローを開発、テスト、バージョン管理、スケジュール設定するためのサービス”です(Dataformの概要より)。
SQLベースの言語とJavascriptを使用して、テーブルやビューの作成、カラムのDescription(説明)の追加・変更、テーブルやビュー同士の依存関係の管理、データ品質をテストするアサーションの構成をすることができます。タグ付けやスケジュール設定による実行の管理など、データパイプラインの構築に役立つ機能が多く備わっています。
Dataformの階層構造
Dataformでは、リポジトリ・開発ワークスペースを作成し、開発ワークスペース内に実行するファイルを構築していきます。
リポジトリの作成手順
- Dataformを開く
- 「+リポジトリを作成」を押下
- リポジトリID、リージョン、サービスアカウントを入力して「作成」を押下
- リポジトリID:リポジトリ名(リポジトリを識別する一意のID)
- リージョン:リポジトリ、開発ワークスペース、リポジトリ内のファイルが保存されるロケーション。
- サービスアカウント:リポジトリに関連付けられているサービスアカウント。デフォルトの場合はDataformが自動で生成。
開発ワークスペースの作成手順
- 作業するリポジトリを開く
- 「開発ワークスペースを作成」を押下
- 「ワークスペースID」を入力して「作成」を押下
実行ファイル構築
最初にやること
リポジトリと開発ワークスペースを新規作成後のワークスペースは”初期化”を求められます。「ワークスペースを初期化」すると以下に示すようなデフォルトのディレクトリとファイルが構成されます。
- definitions/
- includes/
- dataform.json
- package.json
- definitions/first_view.sqlx
- definitions/second_view.sqlx
definitionsディレクトリに格納されている2つのsqlxファイルはサンプルのファイルです(SQLXファイルの詳細は後述)。このファイルを土台としてSQLを構築しても良いし、2つのファイルを削除してゼロから構築を行うのも良いと思います。
実際にテーブルやビューを作成するファイルはdefinitionsに格納します。definitions直下にさらにディレクトリを追加することもできます(作成方法は後述)。データの成形レイヤーをわけてファイルを管理するのに良いですね。
詳細は公式のドキュメントをご覧ください。
ディレクトリと実行ファイルの作成
実行ファイルは、作成したリポジトリ・開発ワークスペース内(ディレクトリ内)に構築していきます。デフォルトのディレクトリにさらにディレクトリを作成することも可能です。
ファイル(またはディレクトリ)の作成手順
- 作業する開発ワークスペースを開く
- ファイル(またはディレクトリ)を作成したいディレクトリの3点リーダーを押下
- 「ファイルを作成」(または「ディレクトリを作成」)を押下
- 「ファイルパス(またはディレクトリパス)を追加」の欄に作成したいファイル(またはディレクトリ)のファイル名を拡張子付きで入力(例:definitions/sqmple.sqlx)
- 「+ファイルを作成」(または「ディレクトリを作成」)を押下
Dataform コア
Dataform コアは、”SQL テーブルとワークフローを作成するためのオープンソースのメタ言語“です(Dataform コアの概要より)。Dataform コアを用いることにより、SQLを拡張した機能を実装することが可能となります。
Dataform コアで実装可能な機能の例を以下に紹介します。
- テーブルやビューの定義
- ソースデータを宣言することによる依存関係の管理
- テーブルやカラムの説明の定義
- アサーション(品質管理用のテストクエリ)の定義
SQLXファイル
SQLXファイルは、Dataform コアを構築していくファイルです。configブロックとbodyブロックにより構成されます。
Configブロック
config{ }で定義します。{ }内には、テーブルのドキュメントやメタデータの指定、アサーション(テスト用クエリ)の定義などができます。
config {
type: "incremental",
tags: ["AABBCC"],
columns: {
column1: "Description of the record column1"
},
uniqueKey: [ "column1", "column2", "column3" ]
}
▼テーブルアクションを対象とした構成オプションの代表例
構成オプション | 説明 | 例 |
type | テーブルのタイプを定義 | table, view, incremental(増分テーブル)など |
tags | タグを定義 | 任意の値 |
columns | カラムの名称や説明を定義 | 任意の値 |
uniqueKey | typeがincremental(増分テーブル)であるときのユニークキーの定義 | ユニークキー |
その他のオプションについては公式ドキュメントをご覧ください。
Bodyブロック
config{ }ブロックの直下にSQLの定義を記載します。SQLにより抽出されるデータでテーブルを作成したり、定義した依存関係をDataformで管理していくことができます。
今回はDataformを活用するうえで押さえておきたい関数をピックアップします。
ref関数/resolve関数
依存関係の定義にはref関数を使用します。
たとえば、sample.sqlxファイルに以下のコードを書いたとします。
※sqlxのファイル名は、そのままテーブル・ビュー名として使用されます。
config {
type: "table",
tags: ["AABBCC"],
uniqueKey: [ "column1"]
}
SELECT
column1,
column2,
column3
FROM ${ref("table_A")}
参照先をref関数で定義すると、Dataformではsampleとtable_Aの二つのテーブルの依存関係を認識します。
上記コードの場合は、sampleというテーブルがtable_Aというテーブルを参照しているという依存関係を定義していることになります。
依存関係を定義した、ということはテーブルやビューの実行順序(sqlxファイルの実行順序)が制御されることにもなります。上記コードを実装したDataformでは、table_A(table_A.sqlx)が実行されてからsample(sample.sqlx)が実行されます。
複数のデータ成形・加工プロセスを管理するためには欠かせない機能です。
また、ref関数の代わりにresolve関数を使うことで、依存関係を定義せずにテーブルの参照先を指定することも可能です。この場合は、参照先のテーブルを指定するだけであり、それぞれのファイルが並列に実行されます。
config {
type: "table",
tags: ["AABBCC"],
uniqueKey: [ "column1"]
}
SELECT
column1,
column2,
column3
FROM ${resolve("table_A")}
実行する
構築したファイルは作成しただけではただのクエリなので、実行をすることではじめてBigqueryにそのデータが反映(保存)されます。
ただ、実行をするためにはコンパイルを完了させる必要があります。Dataformでは、SQLXファイルにクエリを書くと自動でコンパイルを行います。コンパイルのステータスは、画面右側の「コンパイル済みクエリ」に緑のチェックマークが付いているかどうかで確認することができます(失敗の場合は赤いチェックマーク)。「コンパイル済みクエリ」にはファイルに記載したクエリのコンパイル結果が出力されています。
コンパイルが失敗している場合は、エラーメッセージを読みつつクエリを修正しましょう。
【補足】
クエリが正しいにもかかわらずコンパイルエラーになる場合があります。「◯◯のロケーションに△△という名前のテーブルは存在しない」というエラーメッセージが出ている場合は、Bigqueryに△△という名前のテーブルを作成することでコンパイルエラーを解消することができます。
※Dataformでテーブルを作成するクエリを構築している場合は、Bigqueryにテーブルを作成せずともコンパイルエラーがでている状態で実行が可能です。
コンパイルが完了していることが確認できたらいよいよ実行です。
実行は、手動とスケジュール実行の2つの方法があります。
手動実行
手動実行はBigqueryにデータを反映させる通常の実行と、データを反映させないプレビューの実行の2種類の実行が存在します。
プレビューの実行
プレビューの実行を行いたいファイルを開き、ファイル名の右横の「▶︎実行」を押下することでプレビューの実行ができます。
プレビューの実行結果は、画面下部に出力されます。プレビューなのでBigqueryのデータに影響はありません。
通常の実行
画面上部のタブにある「実行を開始▼」を押下すると、実行の条件を選択することができます。
実行の条件を設定したら、設定画面下部の「実行を開始」を押下することで通常の実行が開始されます。
実行ステータスは、画面上部の「Excutions」から確認できます。実行が成功した場合、Bigqueryのデータにクエリの実行結果が反映されます。
スケジュール実行
”毎日◯時に実行させたい”というケースも考えられますよね。Dataformにおいてもスケジュール実行が可能です。
Dataformのリポジトリ内でリリースとスケジュールを設定します。実行対象のテーブルや実行の頻度を指定することで自動実行が可能になります。
左隣のタブの「WORKFLOW EXCUTION LOGS」ではワークスペースでの実行とワークフロー構成による実行の実行ステータス・実行結果のログが確認できます。
終わりに
いかがだったでしょうか。
本記事では、Dataformの基本的な操作を解説いたしました。しかしながら、これはDataformの機能のほんの一部であり、紹介しきれなかった細かな便利機能がたくさん存在しています。
本記事は、入門編として皆様のデータパイプライン構築のお役に立てれば幸いです。
以下に、本記事を書くにあたって参考とさせていただいたサイトを記載いたします。
【参考サイト】
コメント