BigQuery初心者がデータ分析を始めてみた【第3回】公開データセットとパーティション分割

BigQueryには公開データセットが用意されており、無料で大規模データを分析できます。また、パーティション分割を活用することで、スキャン量とコストを大幅に削減できます。

本記事では、Google Trendsのデータセットを使って、これらの応用機能を実際に体験していきます。

はじめに

【第1回】ではネイティブテーブルの作成とクエリ実行、【第2回】ではネイティブテーブルと外部テーブルの使い分けを学びました。

第3回では、より大規模なデータでBigQuery独自の機能を試していきます。

公開データセットへのアクセス

BigQueryには公開データセットが用意されており、無料で大量データを分析できます。今回はGoogle Trendsのデータセットを使ってみます。

アクセス手順

BigQueryのホーム画面には、「テンプレートを使って試す」というセクションがあります。

「Google トレンドのデモクエリを試す」から「データセットを表示」を選択します。

Google Trendsデータセットの詳細ページが表示されます。「データセットを表示」を選択します。

Google Trendsデータセットの詳細ページ

エクスプローラーにbigquery-public-dataプロジェクトが追加されます。

追加されたプロジェクト

テーブル構造の確認

google_trendsデータセットを展開すると、以下のようなテーブルが確認できます。

  • international_top_terms - 国別のTop 25検索キーワード
  • international_top_rising_terms - 国別の急上昇キーワード

international_top_rising_termsテーブル構造を確認してみます。主なカラムは以下の通りです。

  • country_name: 国名
  • country_code: 国コード(例: JP)
  • region_name: 地域名
  • term: 検索キーワード
  • week: 週(日付)
  • score: 人気度スコア
  • rank: ランキング
  • refresh_date: データ更新日

パーティション分割テーブルの活用

Google Trendsのテーブルは日付によるパーティション分割が設定されています。実際にクエリを実行して、パーティション分割の効果を確認してみます。

パーティションを使わないクエリ

まず、パーティションを使わないクエリを実行します。

-- パーティションフィルタなし
SELECT
  term,
  SUM(score) as total_score
FROM `bigquery-public-data.google_trends.international_top_terms`
WHERE country_code = 'JP'
GROUP BY term
ORDER BY total_score DESC
LIMIT 10

パーティションを使ったクエリ

次に、パーティションフィルタ(日付条件)を追加したクエリを実行します。

-- パーティションフィルタあり
SELECT
  term,
  SUM(score) as total_score
FROM `bigquery-public-data.google_trends.international_top_terms`
WHERE country_code = 'JP'
  AND refresh_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
GROUP BY term
ORDER BY total_score DESC
LIMIT 10

スキャン量の比較

クエリ実行前の「このクエリで処理されるデータ量」を比較すると、パーティションフィルタを使った方がスキャン量が大幅に削減されていることがわかります。

(左)パーティションあり(右)パーティションなし

このように、パーティション分割テーブルに対して日付条件を指定することで、必要なパーティションのみがスキャンされ、コストと処理時間を削減できます。

パーティション分割が有効な場面

  • ログデータの分析(日付別)
  • 売上データの集計(月別、四半期別)
  • IoTセンサーデータ(時刻別)

その他のBigQuery独自機能

そのほかに、今後より大規模なデータを扱う際に重要になってくると感じた機能を紹介します。

クラスタリング

パーティション分割と組み合わせて使われる機能で、特定の列の値でデータをソートして保存します。

例えば、国コード(country_code)でクラスタリングすると、特定の国のデータを検索する際にさらに高速化されます。

マテリアライズドビュー

頻繁に実行する集計クエリの結果を事前に計算して保存しておく機能です。

例えば、週次のトレンドランキングを毎日更新する場合、マテリアライズドビューを使うと元データが更新されても自動的に再計算されます。

BI Engine

BigQueryの高速化エンジンで、特にダッシュボードやレポートの表示を高速化します。Data PortalやLooker Studioと組み合わせると効果的です。

クエリコストの確認方法

BigQueryは従量課金制のため、クエリ実行前にコストを把握することが重要です。ただし、毎月1TBまでのクエリ処理と10GBまでのストレージは無料で利用できるため、個人での学習や小規模なデータ分析であれば、無料枠内で十分活用できます。

クエリエディタでクエリを入力すると、実行前に左下に「このクエリで処理されるデータ量」が表示されます。この情報を見ることで、実行前におおよそのコストを見積もることができます。BigQueryの料金は、スキャン1TBあたり約$6.25(東京リージョン)です。

ただし、この機能はネイティブテーブルのみで利用可能です。【第2回】で確認したように、外部テーブルでは事前のスキャン量推定ができないため、実行後に初めて正確なコストがわかります。

まとめ

全3回を通して、BigQueryの基本操作から応用機能まで学びました。

連載全体で学んだポイントです。

  • サーバーレスで環境構築不要、すぐにデータ分析を開始できる
  • ネイティブテーブル(高速・コスト予測可)と外部テーブル(編集容易)の使い分け
  • 公開データセットで大規模データ分析を無料で体験可能
  • パーティション分割でスキャン量とコストを大幅削減
  • 毎月1TBまでのクエリ処理が無料

BigQueryを活用することで、数TB規模のデータを数秒で集計でき、インフラ管理不要でデータ分析に集中できます。また、Google Workspaceとシームレスに連携し、従量課金で無駄なコストを削減できる点も魅力です。

本連載で紹介した内容は、すべて無料枠内で実践できます。パーティション分割によるコスト削減効果は、実際のプロジェクトでも大きな威力を発揮します。ぜひ実際に手を動かして、BigQueryの可能性を体験してみてください。

次は、コスト最適化テクニックの実践、Google Apps ScriptとBigQueryの連携、Looker StudioでのBI構築など、より実践的な活用方法を試していきたいと思います。

執筆担当者プロフィール
寺内 爽併

寺内 爽併(日本ビジネスシステムズ株式会社)

メディア・エンターテインメント本部インテグレーション部3G所属。 Google CloudやGoogle Workspaceを中心に扱っています。

担当記事一覧