スマートウォッチやスマートフォンから収集した「歩数」や「心拍数」などの健康バイタルデータ。これらを本格的に分析・可視化したい時、FirestoreからBigQueryへのデータ連携は非常に強力なアプローチです。
本記事では、健康管理アプリの「健康管理・バイタルデータ」を例に、Firebase公式の拡張機能 「Stream Firestore to BigQuery」 を使った連携手順から、データ移行、迅速なカラム展開を行うSQLビュー(View)の作成まで、一連の流れをわかりやすく解説します!
1. Firebase Extensionsによる自動同期(初期設定)
まずは、Firestoreのデータ変更をリアルタイムにBigQueryへストリーミングする環境を構築します。
① 「Stream Firestore to BigQuery」の導入
- 拡張機能の追加 Firebaseコンソールから公式拡張機能「Stream Firestore to BigQuery」を追加します。これはバックアップ(コピー)処理であるため、元のFirestoreのデータが削除・消失する心配はありません。
- 【超重要】リージョンの選択
データ転送先のリージョンは、原則として「東京(
asia-northeast1)」を選択します。デフォルトの「マルチリージョン」を選択すると、世界中にデータがコピーされる設定になり、コスト(転送量・保管料)が非常に高くなってしまうため注意してください。 - コレクションパスの指定
同期対象とするFirestoreのコレクションパス(例:
health_metrics)を入力します。 - 反映確認時の注意点 デプロイ完了直後、BigQueryの管理画面上で「準備完了」と表示されていても、内部の処理が完全に終わるまでは「テーブルが存在しません」といったエラーが表示されることがあります。この場合は、エラーが消えるまで数分ほど時間をおいてから再度確認しましょう。
💡 【プロのTips】命名規則(ネーミング)は「ルール決め」が命!
拡張機能の設定時には、BigQuery側に作成されるテーブルの接頭辞(Table ID prefix)を指定できます。 あらかじめfirebase_export_など「Firestoreから同期したテーブルには、このプレフィックスをつける」というルールを1つ決めておくだけで、後からJSONを展開するための分析用ビュー(View)を作成する時の作業が劇的に楽になります。
- ビューが作りやすくなる理由:
BigQueryの中に様々なテーブルや外部データが混在していっても、例えば「
firebase_export_から始まるテーブルを元にビューを作ればいいんだな」と一目でわかるため、SQLを組み立てる際のデータソース特定が非常にスムーズになります。 - 結果として生成されるテーブル名:
firebase_export_health_metrics_raw_latestのようになり、データソースが非常に明確になります。
2. 過去データの初期同期(データ移行スクリプト)
Extensionsのデプロイが完了した後に新規追加・更新されたデータはリアルタイムにBigQueryに同期されますが、それ以前に存在していた過去データ(既存データ)は自動同期されません。
そこで、既存データをBigQueryへ一括で流し込むためのシンプルな「一括同期スクリプト」を実行します。
移行スクリプトのシンプルな仕組み
- 動作内容: ローカル環境から、同期させたいコレクションの既存レコードをFirestoreに対して1件ずつ上書き(または疑似更新)するNode.jsスクリプトを実行します。
- なぜこれで同期できるのか? Firestore側に強制的にデータ書き込みを発生させることで、拡張機能(Extensions)の同期トリガーが作動し、古いデータも含めてすべての過去データが自動的にBigQuery側へ転送されます。
- 実行時の手軽さ: VS Codeのプラグイン 「Code Runner」 を活用すれば、JSファイル上に用意した実行ボタンからワンクリックで同期プロセスを走らせることができます。FirestoreはNoSQL構造であるため、事前に厳しいテーブル設計をしなくても、データを追加するだけで柔軟に同期が完了します。
3. BigQueryの「Changelog」と「Latest」の使い分け
同期が完了すると、BigQuery内に対象コレクションに対応するデータが作成されます。この時、データソースとして以下の2つのテーブル(またはビュー)が存在します。
| 参照するデータソース | データの性質 | 分析における主な用途 |
|---|---|---|
firebase_export_..._raw_changelog(変更履歴) |
Firestore上で行われた「新規作成」「更新」「削除」のすべての履歴を時系列で保存したデータ。 | 「いつ、データの状態がどのように変化したのか」といった、過去の推移やデータ更新の履歴を追跡したい場合に使用。 |
firebase_export_..._raw_latest(最新状態) |
各ドキュメントIDにおいて、「現在の最新状態」のみを表現したビュー。もし元データが削除されていれば非表示になります。 | 通常の集計や、ユーザーの最新のバイタル情報を可視化するデータ分析で最も頻繁に使用するメインの参照先。 |
通常、BIツールやレポート作成のためのデータ分析では、ドキュメントの最新状態を保持している _raw_latest の方を参照します。
4. JSON形式のデータをSQL(ビュー)でカラム展開する
エクスポートされた生のテーブルデータは、Firestoreのフィールドがすべて data という単一のカラムの中にJSON形式の文字列として格納されています。
このままでは分析しづらいため、BigQuery側で「分析専用のデータセット」を新たに作成し、SQLの JSON_VALUE 関数を使ってデータをカラムごとに展開した「ビュー(View)」を作成します。
💡 なぜ分析専用のデータセットにビューを作るのか? 元データを直接触らず、テーマごとにデータセットを分けてビューを作成することで、将来的に「誰にどのデータを見せてよいか」というアクセス権限のコントロールが格段にやりやすくなるためです。
SQLによる展開クエリ例
以下は、健康管理アプリのバイタルデータ(health_metrics)を想定した、命名規則を考慮したシンプルなSQLテンプレートです。日付などの値も、複雑な型変換を行わずシンプルにJSONから文字列として抽出しています。
SELECT
-- 1. ドキュメントIDを展開し、わかりやすい別名(エイリアス)に変更
document_id AS metric_id, --
-- 2. JSON内の各キーを抽出し、適切なデータ型にキャスト
JSON_VALUE(data, '$.user_id') AS user_id, --
JSON_VALUE(data, '$.metric_type') AS metric_type, -- 例: 'heart_rate' (心拍数), 'steps' (歩数)
CAST(JSON_VALUE(data, '$.value') AS FLOAT64) AS value, -- バイタルの数値型(小数含む)
JSON_VALUE(data, '$.device_type') AS device_type, -- 例: 'smart_watch', 'smartphone'
-- 3. 日時の抽出(パースせずシンプルな文字列変換でOK)
JSON_VALUE(data, '$.recorded_at') AS recorded_at, -- 測定・記録日時
JSON_VALUE(data, '$.updated_at') AS updated_at --
FROM
-- BigQueryが自動生成した「_raw_latest」テーブルを参照(プレフィックスが付いていて探しやすい!)
`your-global-health-project.firebase_export.firebase_export_health_metrics_raw_latest` --
-- 【重要】テスト実行時のクエリ課金を抑えるための安全策
LIMIT 100 --
ビューの保存と注意点
- 構文の重複チェック
クエリ内に同じカラム名(エイリアス)が重複して定義されていないか確認します(例:
updated_atが2回書かれていないかなど)。 - ビューとして保存 BigQueryのエディタで上記のクエリを実行し、結果が正しくテーブル状にマッピングされていることを確認したら、「ビューを保存(Save View)」を選択します。
- データセットに保存
分析用データセット(例:
health_analytics)の中に、view_health_metricsなどの名前で保存します。
これで、BIツール(Looker StudioやTableauなど)から普通のテーブルと同じようにカラム指定で快適にデータを引っ張ってこれるようになります!
5. 【チェックリスト】実装時の重要な注意点
- ネーミングルールを決めておく 先述した通りプレフィックスの設定は任意ですが、これを行うだけでデータの「迷子」がなくなり、ビュー作成のためのSQL記述やメンテナンスが圧倒的にシンプルになります。
- 課金対策(
LIMIT制限の徹底) BigQueryはスキャンするデータ量に応じて課金されます。特に過去データを大量移行した直後に動作確認クエリを叩く際は、必ずLIMIT 100などの制限をかけてください。 - 重複カラムの排除 SQLでJSONを展開していく際、手動コピペを繰り返すとカラム定義が重複してエラーを招く原因になります。保存前にクエリのセルフチェックを行いましょう。
まとめ
FirestoreからBigQueryへの同期、および分析用ビューの作成は、以下のステップで驚くほどシンプルに実現できます。
- Firebase Extensions でリアルタイム同期の基盤を爆速で構築する。
- コスト削減のためにリージョン(東京)の選定を徹底する。
- ビューの作りやすさを劇的に変えるために、
firebase_export_という命名プレフィックスを付与する。 - 過去データは簡単な一括移行用スクリプトで流し込む。
- 分析用途には
_raw_latestの最新データソースを使い、ビュー(View)でスキーマを展開する。
最初の「命名のルール決め」や「データセットの切り分け設計」を丁寧に行おくことで、セキュリティ的にもコスト的にもクリーンなモダンデータ分析基盤が完成します。ぜひお試しください!

