本書を手に取っていただき、ありがとうございます。本書は、Google Cloudが提供しているデータウェアハウスサービス「BigQuery」をメイントピックとして扱います。BigQueryやデータ基盤について知らない方でも最初の一歩として手にとっていただけるように執筆しました。
データ基盤と聞くと、データエンジニアやデータサイエンティスト、機械学習エンジニア、会社によってはITインフラエンジニア・SREが関わることが多いと思いますが、Webエンジニアはクエリ実行することはあれどデータ基盤の構築まで踏み込むことは少ないと思います。
本書は本格的なデータ基盤の構築までは踏み込みませんが、BigQueryへのデータの投入からクエリ実行、ダッシュボードによる可視化をひととおり学べるという本です。50ページ程度のボリュームなのでサクッと読めるはずです。読みながらぜひ手を動かしてBigQueryとその周辺ツールの便利さを体験してもらえればと思っています。
本書では、次の内容について取り扱っていません。
本書の内容にしたがって手を動かす場合に、GCPアカウントのセットアップが必要です。初めてGCPに触られる人は次のURLから無料トライアルに登録してください。無料トライアル中は300 USDの無料クレジットが付きますので、本書で取り扱っている各種サービスを実行しても料金はかかりません。
https://console.cloud.google.com/getting-started
本書では「ohsawa0515-bq-nyumon」をGCPのプロジェクトIDとして説明します。各々の環境に読み替えてください。
本書は情報の提供のみを目的としています。本書の内容を実行・適用・運用したことで何が起きようとも、それは実行・適用・運用した人自身の責任であり、著者や関係者はいかなる責任も負いません。
本書で載せている料金は特に断りがない限り、2022年9月時点の東京リージョンの料金です。料金は今後変更になる可能性があるため、GCP公式の料金表をご確認ください。
本章では、第一歩として一般公開されているデータセットをつかってBigQueryからクエリを実行してみます。BigQueryをつかううえで俗に言う「クラウド破産」と呼ばれる多額な料金発生が気になると思いますが、料金体系を理解することで利用額をおおよそ予測できるので恐れることはありません。
キーワード:BigQueryの料金、データセット
BigQueryの料金は主に分析(クエリ)、ストレージ、データ取り込み、データ抽出で発生します。
BigQueryに対してSQLクエリを実行した際に発生する費用です。クエリ料金にはオンデマンドと定額の2種類の料金モデルがあります。
クエリによってスキャンされたデータ量に基づいて料金が発生します。東京リージョンでは1TBあたり6 USDです(毎月1TBまで無料)。「スキャンされた」がポイントで、クエリの書き方によって料金がかかります(スキャン量を意識したクエリの書き方は「2.3 効率的なクエリの書き方」を参照)。エラーが返されたり、キャッシュから結果が返された場合は料金は発生しません(キャッシュについては「4.7 料金について」を参照)。
BigQueryの定額料金はBigQuery Reservationsという機能で提供されています。スロットと呼ばれる仮想CPUの単位を事前に購入し、GCPプロジェクトに割り当てることで有効化されます。期間は秒(Flex Slots)、月、年単位で購入できます。オンデマンド料金だと事前見積もりが難しいゆえに予算管理が厳しい場合に役立ちます。
BigQueryに保存される際に発生する費用です。ストレージ料金にはアクティブストレージと長期保存の2種類があります。なお、毎月10GBまでは無料です。
過去90日間で変更されたテーブルやパーティションはアクティブストレージとして料金が発生します。変更は追加(INSERT)と更新(UPDATE)が対象です。料金は1GBあたり0.023 USDで、Google Cloud Storage(以下、GCS)*1のStandard Storageと同じです*2。
90日間連続して変更されていないテーブルやパーティションは長期保存として料金が自動的に変更されます。料金は1GBあたり0.016 USDで、GCSのNearline Storageと同じです。パフォーマンス、可用性、耐久性についてアクティブストレージと違いはないため、ログなど長期的に保存する要件に対して有効です。
[*1] Googleが提供しているオブジェクトストレージサービス。
[*2] https://cloud.google.com/storage/pricing#asia
請求されるストレージ料金は非圧縮状態でのデータ量です。例えば、GCSに圧縮したファイルを置いてBigQueryにデータ取り込みした場合、GCSでのストレージ費用とBigQueryでのストレージ費用は必ずしも一致しません。参照する機会は少なく、コストを少しでもおさえたい場合はGCSに保存して外部テーブル*3として参照するのが良いでしょう。
[*3] https://cloud.google.com/bigquery/docs/external-data-sources
バッチ取り込みにかかるデータ取り込みは無料です。ストリーミング(リアルタイム性を必要とする)の場合は200MBあたり0.012 USDの料金が発生します。BigQuery Storage Write APIと呼ばれる大量のデータ取り込みできるAPIを利用すると1GBあたり0.03 USD発生します。
バッチによるデータ抽出は無料です。ストリーミングの場合は1TBあたり1.32 USDかかります。BigQuery Storage Read APIと呼ばれる高速にデータ取得できるAPIを利用した場合も1TBあたり1.32 USDかかります。Pythonライブラリ(google-cloud-bigquery)を使ってデータ抽出する場合、Storage APIを暗黙的に使用している場合があります*4。
[*4] https://googleapis.dev/python/bigquery/latest/generated/google.cloud.bigquery.job.QueryJob.html?highlight=to_dataframe#google.cloud.bigquery.job.QueryJob.to_dataframe
一般公開データセットと呼ばれる、一般提供されているデータセット*5を使ってクエリを実行します。今回はCOVID-19のオープンデータを使います。
[*5] テーブルなどを束ねたもので、RDBにおけるデータベースのようなものです。
[*6] https://console.cloud.google.com/bigquery
せっかく作成したクエリを後で再利用したい場合があります。そのときはクエリを保存すると便利です。