今回も、Professional Cloud Data Engineer認定取得するために、私が勉強した内容をアウトプットしていきます。
今回は、Dataform、Dataformのワークスペース、Dataformのテーブルについて説明します!
ぜひ、最後までご覧いただけると嬉しいです!
Dataform
Dataformは、一言で言うと「データ分析のための下準備(データ変換)を、チームで効率よく、かつ品質を高く行うためのサービス」です。
私たちが普段データ分析に使うデータは、そのままの形では分析に適していないことがほとんどです。例えば、
- 複数のテーブルに情報が散らばっている
- 不要なデータや古い情報が含まれている
- 表記の揺れ(例:「株式会社」と「(株)」)がある
など、様々な問題を抱えています。
Dataformは、こうした元データ(生データ)から、分析に使いやすい「データマート」と呼ばれる綺麗なデータセットを作り出すための一連の作業(SQLワークフロー)を、体系的に管理し、自動化することができます。
これは、料理に例えると分かりやすいかもしれません。様々な食材(生データ)を、レシピ(SQLクエリ)に沿って下ごしらえし(データ変換)、すぐに調理できる状態のミールキット(データマート)を作るようなものです。Dataformは、この「レシピの作成からミールキットの完成まで」を管理してくれる、頼れる厨房アシスタントなのです。
Dataformでできること
Dataformを導入すると、具体的に以下のようなメリットがあります。
- SQLクエリの管理が楽になる
- 複数のSQLクエリを「ワークフロー」として一元管理できます。
- クエリ間の依存関係(「このクエリは、あのクエリが終わってから実行する」といった関係)を自動で解決してくれます。
- Gitと連携することで、SQLコードのバージョン管理が可能になり、「いつ、誰が、何を、なぜ変更したか」を正確に追跡できます。これにより、チームでの共同作業がスムーズになり、誤った変更を元に戻すのも簡単です。
- データ品質の向上が期待できる
- 「このカラムは絶対にNULLであってはいけない」「このカラムの値は必ず正の数である」といったデータの品質テスト(アサーション)を定義できます。
- テストに合格しなかった場合はアラートを通知し、問題のあるデータが下流の分析に使われるのを防ぎます。
- 作業の属人化を防ぐ
- 各テーブルやカラムの説明をコード内に直接記述でき、それが自動的にドキュメントとして生成されます。
- 複雑なSQLクエリも、その目的や意図がドキュメント化されることで、他の人が見ても理解しやすくなり、作業の引き継ぎが容易になります。
- 開発がスピードアップする
- JavaScriptを利用して、定型的なSQLコードを再利用可能なテンプレートとして作成できます。これにより、似たようなクエリを何度も書く手間が省け、開発効率が大幅に向上します。
Dataformの仕組み
Dataformでは、「SQLX」という特別なファイルにSQLクエリを記述していきます。SQLXファイルは、通常のSQLに加えて、Dataform独自の機能を使うための簡単な設定を記述できるようになっています。
例えば、以下のようにファイルの先頭でconfig
ブロックを定義するだけで、
- このクエリがどんな種類のテーブル(
type: "table"
)を作成するのか - BigQueryのどのデータセットに、どのテーブル名(
schema: "dataform", name: "reporting_table"
)で作成するのか
といった設定を行うことができます。
config {
type: "table",
schema: "dataform",
name: "reporting_table"
}
SELECT
country,
SUM(revenue) AS total_revenue
FROM
${ref("source_table")}
GROUP BY 1
また、${ref("source_table")}
のように記述するだけで、source_table
という別のテーブルを参照できます。Dataformは、このref
関数を解析し、SQLクエリの実行順序を自動的に判断してくれます。
Dataformのまとめ
Dataformは、データ分析の前工程であるデータ変換ワークフローを、コードとして宣言的に管理するための強力なフレームワークです。
バージョン管理、テスト、ドキュメント化といったソフトウェア開発のベストプラクティスをデータの世界に持ち込むことで、データ準備のプロセスを標準化し、信頼性と再利用性を高めることができます。
Dataformを使いこなすことで、面倒なデータ準備作業から解放され、より創造的で価値のあるデータ分析業務に集中できるようになるはずです。
Dataformのワークスペース
Dataformのワークスペースとは、一言で言うと「自分のための、一時的な開発環境」です。
Gitリポジトリ(SQLコードが保管されている場所)のコピーを自分の手元に持ってきて、自由に編集したり、試したりできる仮想的な作業スペースだと考えてください。
主な特徴
- リポジトリのサンドボックス:ワークスペースは、リポジトリのいわば「サンドボックス」です。ここで行った変更は、あなたが明示的にリポジトリに保存(コミット&プッシュ)するまで、他の開発者や本番環境に影響を与えません。安心して新しいコードを試したり、既存のコードを修正したりできます。
- 開発の拠点:SQLワークフローのコード(SQLXファイル)を作成、編集、コンパイル(コードにエラーがないかチェック)、そしてBigQuery上でテスト実行するまでの一連の開発作業は、すべてこのワークスペース内で行います。
- 一時的な存在:ワークスペースは、特定の開発作業のために作成され、作業が終われば削除することが推奨される、一時的な環境です。
ワークスペースでの開発の流れ
Dataformでの開発は、基本的に以下のサイクルを繰り返します。
- ワークスペースを作成する:まず、開発作業を始めるために、リポジトリから自分のワークスペースを作成します。これにより、リポジトリの最新の状態があなたの作業環境にコピーされます。
- コードを開発・編集する:ワークスペース内で、新しいテーブルを定義したり、既存のSQLクエリを修正したりします。
- コンパイルしてエラーをチェックする: コードを書き終えたら、「コンパイル」を実行します。これにより、Dataformがコード全体の構文エラーや、テーブル間の依存関係が正しいかをチェックしてくれます。
- 実行してテストする:コンパイルが成功したら、実際にBigQuery上でクエリを実行して、意図した通りのデータが作成されるか、結果が正しいかなどをテストします。
- 変更をコミット&プッシュする:開発したコードに問題がなければ、変更内容を保存(コミット)し、元のリポジトリに反映(プッシュ)します。この操作によって、あなたの変更がチーム全体で共有されます。
- ワークスペースを削除する:作業が完了したら、作成したワークスペースを削除します。これにより、環境がクリーンに保たれます。(もちろん、作業の途中で中断する場合は、そのまま残しておくことも可能です。)
なぜワークスペースが必要なのか?
ワークスペースを利用することで、以下のような大きなメリットがあります。
- 安全な開発:本番環境のコードを直接触ることなく、隔離された安全な環境で開発ができるため、誤って重要なデータを壊してしまうリスクを防ぎます。
- スムーズな共同作業:各開発者が自分専用のワークスペースで作業するため、他の人の作業を妨げることがありません。複数の開発が同時並行で進めやすくなります。
- バージョン管理の徹底:すべての変更がGitを通じて管理されるため、「いつ、誰が、何を、なぜ変更したのか」が明確になり、品質の高いデータ基盤を維持することに繋がります。
Dataformのワークスペースのまとめ
Dataformのワークスペースは、安全かつ効率的にデータ変換ワークフローを開発するための、必要不可欠な機能です。リポジトリのコピーであるこの仮想環境の中で、コードの編集からテストまでを行い、完成したらリポジトリに反映させる、という流れを覚えておきましょう。
Dataformのテーブル
Dataformでデータ変換ワークフローを構築する際、その中心となるのが「テーブル」の定義です。ここでの「テーブル」とは、分析の元となる単なるデータの集まりではなく、ドキュメントやテスト、依存関係が組み込まれた、管理可能なデータ資産を指します。
この記事では、Dataformの心臓部であるテーブルの作成方法と、その動作を細かく制御するための設定について解説します。
テーブルを作成する基本の形
Dataformでは、1つのSQLファイル(.sqlx
)が、原則として1つのテーブル(またはビュー)に対応します。最も基本的な形は、config
ブロックとSELECT
文の組み合わせです。
<definitions/my_first_table.sqlx>
-- configブロックでテーブルの設定を定義します
config {
type: "table"
}
-- このSELECT文の結果がテーブルの中身になります
SELECT 1 AS column_a
これだけで、my_first_table
という名前のテーブルが作成されます。
そして、Dataformの強力な機能の一つが、テーブル間の依存関係を簡単に定義できるref()
関数です。
-- `source_table`という名前のテーブルを参照しています
SELECT * FROM ${ref("source_table")}
このようにref()
を使うことで、Dataformは自動的にテーブル間の依存関係を理解し、「source_table
を作成した後に、このクエリを実行する」という正しい順番で処理を行ってくれます。
用途で使い分ける4つのテーブルタイプ
Dataformでは、config
ブロックのtype
プロパティで、作成するテーブルの種類を指定できます。これにより、コストやパフォーマンスを最適化できます。
1. table
(テーブル)
最も標準的なタイプです。SELECT
文の結果を物理的なテーブルとしてデータウェアハウス(BigQueryなど)に作成します。データを実体として保持するため、後続のクエリは高速に実行できます。
2. view
(ビュー)
SELECT
文をビューとして保存します。データの実体は持たず、クエリが実行されるたびに元のテーブルにアクセスします。ストレージコストはかかりませんが、複雑なビューの場合はパフォーマンスに影響することがあります。
config {
type: "view"
}
SELECT * FROM ${ref("some_large_table")} WHERE country = "JP"
3. incremental
(増分テーブル)
Dataformの非常に強力な機能です。このタイプを指定すると、毎回すべてのデータを洗い替えるのではなく、新しく追加されたデータだけを処理してテーブルを更新できます。
大量のデータを扱うテーブル(アクセスログなど)に使うことで、処理時間を大幅に短縮し、クエリコストを劇的に削減できます。
config {
type: "incremental"
}
SELECT * FROM ${ref("source_logs")}
-- 増分更新を有効にするためのWHERE句
${when(incremental(), `WHERE event_timestamp > (SELECT MAX(event_timestamp) FROM ${self()})`)}
when(incremental(), ...)
:増分更新の際にのみ、このWHERE
句が追加されます。self()
:自分自身のテーブル(更新先のテーブル)を参照します。
4. operations
(オペレーション)
CREATE TABLE
以外のSQL文(DMLやDDL)を実行したい場合に使用します。例えば、テーブルへの権限付与(GRANT
)や、特定のレコードの削除(DELETE
)などに利用できます。
config
ブロックでテーブルをさらに便利に
config
ブロックでは、type
以外にも様々な設定が可能です。ここでは特に重要なものをいくつか紹介します。
schema
:テーブルを作成するデータセット(スキーマ)を指定します。(例:schema: "marketing"
)name
:ファイル名とは別のテーブル名を付けたい場合に使用します。(例:name: "daily_sales_summary"
)description
:テーブルやカラムの説明を記述できます。ここに書いた内容は、Dataformの自動生成ドキュメントに反映されるほか、BigQueryのテーブルメタデータとしても登録され、非常に便利です。tags
:テーブルにタグを付けることができます。例えば"daily"
や"finance"
といったタグを付けておくことで、特定のタグが付いたテーブルだけを実行するなど、柔軟なワークフロー管理が可能になります。bigquery
:BigQuery固有の設定を行えます。パフォーマンスとコスト最適化に不可欠なパーティショニング (partition_by
) やクラスタリング (cluster_by
) の設定もここで行います。
Dataformのテーブルのまとめ
Dataformにおけるテーブル定義は、単にSQLを書くだけでなく、そのテーブルがどのような種類で、どのような依存関係を持ち、どのようにドキュメント化され、どのように最適化されるべきかをコードとして宣言的に管理する行為です。
これらの設定を使いこなすことで、あなたのデータパイプラインはより堅牢で、効率的で、誰にとっても分かりやすいものになるでしょう。まずはシンプルなtable
やview
の作成から始め、慣れてきたらincremental
テーブルや各種設定に挑戦してみてください。
まとめ
今回は、下記3点について説明しました。
- Dataform
- Dataformのワークスペース
- Dataformのテーブル
今回の記事では、Dataformの基本概念から、開発環境となるワークスペース、そしてデータ変換の核となるテーブル定義までを体系的に解説しました。Dataformは、データ変換をコードとして管理し、バージョン管理やテストを通じて高品質なデータ準備を可能にします。ワークスペースを活用することで、安全かつ効率的な開発が行え、テーブル定義を適切に設計することで、堅牢で再利用性の高いデータパイプラインを構築できます。
これからも、Macのシステムエンジニアとして、日々、習得した知識や経験を発信していきますので、是非、ブックマーク登録してくれると嬉しいです!
それでは、次回のブログで!