1. データの準備と取り込み
ETL と ELT、取り込みの全体像
データ活用は 取り込み (Ingest) → 保存 (Store) → 変換 (Transform) → 分析 (Analyze) の流れで考えます。Google Cloud では、変換を BigQuery の外で行う ETL よりも、まず BigQuery にロードして SQL で変換する ELT が推奨される場面が多いです。
| 方式 | 特徴 | 代表サービス |
|---|---|---|
| ETL | 変換してからロード。複雑な加工・ストリーム処理向き | Dataflow, Dataproc, Cloud Data Fusion |
| ELT | 先にロードし DWH 内の SQL で変換。シンプル・SQL 人材で運用可能 | BigQuery + Dataform / スケジュールクエリ |
| CDC / レプリケーション | DB の変更差分を継続的に反映 | Datastream |
| SaaS・他クラウド連携 | ノーコードで定期転送 | BigQuery Data Transfer Service |
バッチ取り込み:Cloud Storage と BigQuery ロード
バッチ取り込みの基本は Cloud Storage にファイルを置き、BigQuery へロードジョブを実行することです。ロードジョブは無料(スロット共有プール利用)で、ストリーミング挿入は課金対象です。
| 形式 | 特徴 |
|---|---|
| Avro | スキーマ内包・行指向・圧縮可。BigQuery ロードで最も推奨(並列読込が効率的) |
| Parquet / ORC | 列指向・スキーマ内包。分析・Hadoop/Spark 系と相性が良い |
| CSV | スキーマなし(自動検出可)。ヘッダ・区切り・クォート処理に注意 |
| JSON (NDJSON) | 改行区切り JSON。ネスト構造(STRUCT/ARRAY)を表現可能 |
bq load --source_format=PARQUET mydataset.sales gs://my-bucket/sales/*.parquet
bq load --autodetect --source_format=CSV --skip_leading_rows=1 mydataset.t gs://b/data.csv
- 書き込み設定:WRITE_APPEND(追記)/WRITE_TRUNCATE(置換)/WRITE_EMPTY(空のときのみ)
- ロードしたくない場合は 外部テーブル / BigLake テーブルで Cloud Storage を直接クエリ(性能は劣るが即時利用可)
- 大量ファイル転送:Storage Transfer Service(他クラウド・オンプレ→GCS)、Transfer Appliance(超大容量オフライン)
ストリーミング取り込み:Pub/Sub と Dataflow
Pub/Sub はフルマネージドのメッセージングサービス(非同期・疎結合・at-least-once 配信)。パブリッシャーがトピックへ送信し、サブスクライバーがサブスクリプション経由で受信します。
- BigQuery サブスクリプション:Pub/Sub から BigQuery へ直接書き込み(Dataflow 不要)
- Cloud Storage サブスクリプション:メッセージをファイルとして GCS へ保存
- Pull / Push:Pull はサブスクライバーが取得、Push は HTTPS エンドポイントへ配信
- Dead-letter トピック:処理に失敗し続けるメッセージの退避先
Dataflow は Apache Beam ベースのフルマネージド処理基盤で、バッチとストリーミングを同じコードで扱えます。オートスケール、ウィンドウ処理(Fixed / Sliding / Session)、遅延データ(ウォーターマーク・トリガー)を扱えます。Google 提供のテンプレート(例:Pub/Sub → BigQuery、GCS Text → BigQuery)でコードなしでも実行可能です。
| 要件 | 選択 |
|---|---|
| イベントを受けて即座に BigQuery へ格納(変換なし) | Pub/Sub BigQuery サブスクリプション |
| ストリームの集計・結合・変換 | Dataflow |
| BigQuery へ直接ストリーミング挿入するアプリ | BigQuery Storage Write API(推奨) |
データベース・SaaS からの取り込み
| サービス | 用途 |
|---|---|
| Datastream | MySQL / PostgreSQL / Oracle / SQL Server 等から BigQuery・GCS へサーバーレス CDC(低遅延レプリケーション) |
| BigQuery Data Transfer Service (DTS) | Google 広告・YouTube・GA・Amazon S3・Teradata 等からのスケジュール転送。マネージドでノーコード |
| Database Migration Service | データベース移行(Cloud SQL / AlloyDB へ)。分析用途の CDC ではない |
| Cloud Data Fusion | GUI でパイプラインを構築(CDAP ベース)。多数のコネクタ |
| Federated query / 外部接続 | Cloud SQL / Spanner などを BigQuery から直接クエリ(EXTERNAL_QUERY) |
データの変換・クレンジング
取り込み後は 品質確認 → クレンジング → 整形 を行います。主なデータ品質の観点:完全性(欠損)・一意性(重複)・正確性・一貫性(形式)・適時性。
| 課題 | 対処(BigQuery SQL 例) |
|---|---|
| 欠損値 | COALESCE(col, 0)、IFNULL、行の除外、平均値/中央値補完 |
| 重複 | SELECT DISTINCT、ROW_NUMBER() OVER (PARTITION BY id ORDER BY ts DESC) = 1 や QUALIFY |
| 型・形式の不一致 | CAST / SAFE_CAST、PARSE_DATE、REGEXP_REPLACE、TRIM / LOWER |
| 外れ値 | 四分位範囲(IQR)・標準偏差で検出し、除外/丸め |
| JSON / ネスト | JSON_VALUE、UNNEST で展開 |
CREATE OR REPLACE TABLE clean.orders AS
SELECT * EXCEPT(rn) FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY updated_at DESC) rn
FROM raw.orders)
WHERE rn = 1;
- Dataform:BigQuery 上の SQL 変換(ELT)をバージョン管理・依存関係管理・テスト(assertions)付きで運用
- Cloud Data Fusion の Wrangler/Dataproc の Spark:コード/GUI による変換
- Gemini in BigQuery:自然言語から SQL 生成・データ準備の支援
BigQuery のテーブル設計(パーティション・クラスタ)
- パーティション:日付/タイムスタンプ列・取り込み時間・整数範囲で分割。パーティションプルーニングでスキャン量とコストを削減。
require_partition_filterで全件スキャンを防止 - クラスタリング:最大4列で並べ替え。フィルタ/集計の高速化。パーティションと併用可
- パーティション向き:日付範囲での絞り込みが多い/クラスタ向き:カーディナリティが高い列でのフィルタ
- 非正規化・ネスト(STRUCT/ARRAY):BigQuery では JOIN を減らす非正規化が有利
- ワイルドカードテーブルよりパーティションテーブルを推奨(シャーディングは避ける)
CREATE TABLE ds.events (ts TIMESTAMP, user_id STRING, type STRING)
PARTITION BY DATE(ts) CLUSTER BY user_id, type
OPTIONS (partition_expiration_days = 90, require_partition_filter = TRUE);Dataproc と取り込みサービスの使い分け
Dataproc は Spark / Hadoop / Hive / Flink 等のマネージドクラスタ。既存のオンプレ Hadoop/Spark ジョブを最小変更で移行したい場合に選びます。Dataproc Serverless ならクラスタ管理なしで Spark バッチを実行できます。ephemeral(使い捨て)クラスタ+ Cloud Storage 保存(コンピュートとストレージの分離)がベストプラクティス。
| 状況 | 最適 |
|---|---|
| 既存 Spark ジョブの移行 | Dataproc |
| 新規のバッチ/ストリーム処理でインフラ管理を避けたい | Dataflow |
| ノーコードで ETL を組みたい | Cloud Data Fusion |
| SQL だけで変換できる | BigQuery(Dataform) |
| Oracle→BigQuery の継続的レプリケーション | Datastream |
| Google 広告データの日次取り込み | BigQuery Data Transfer Service |