Bigquery

【パーティション】Bigqueryの料金体系と安全に安く使う方法を丁寧に解説!

ぐぅ

ぐぅ

京大工学部▶︎京大大学院情報学研究科▶︎日系企業のITエンジニア。研究室ではAI×通信の研究も行いAIにも知見あり。友人とプログラミング初学者向けブログ「はやぶさエンジニア」を運営。ノーコードで起業し、サブスク型サービスを運営。26歳大阪在住

★本記事は10分で読み終わることができます。

現役エンジニアである筆者が実例を元にBigqueryの料金体系や安く済ませる方法を解説した記事です。

今、Googleの提供するBigqueryの活用がデータサイエンス業界で広まっています。

そんな中で、Bigqueryを使ったら高額請求された」という記事を読んだ方もいるかと思います。実際には、ちゃんと使い方を知っていれば絶対に高額な請求額にはなりません。

この記事ではBigqueryの料金体系を解説した後、安全に安くデータ分析をする方法を丁寧に解説します。

Bigqueryとは

Bigquery

BigQuery とは Google Cloud Platform(GCP) の中の1つのサービスで、主にビッグデータを解析するために利用されます。

一般的にはDWH(データウェアハウス)といって、データを蓄積する目的にも使えます。

そもそも「GCPとは、GoogleがYoutubeや検索エンジン、Mapなどのサービスを構築している基盤をユーザ・クライアントに向けて使えるようにしたクラウドサービス」です。

Googleの超エリートエンジニアたちが使っている社内基盤を利用できる素晴らしいサービスですね。

その中でBigqueryは Google 社内で利用していた「Dremel(ドレメル)」という大規模なデータ分析を実行するツールを、外部ユーザー向けに利用できるようにしたサービスが BigQuery となります。

Googleといえば検索エンジンですが、Google社員は検索されたワードやユーザの行動などを日々解析し、より高度なサービスを目指しているのは知っているかと思います。その莫大なデータを解析しているツールが圧倒的な速さであることも理解できますね。

また、クラウドサービスの特徴であるサーバーレス、スケーラビリティを活かして、安価で高速なデータ処理を実現しています。これは簡単にいえば「使う分だけを使った時だけ利用できる」です。

BigqueryはSQLを使える人なら即座に利用できます。エクセルやGoogle スプレッドシートのデータなどのパソコン内に保存しているファイルをアップロードして解析できるので試してみてください。

より詳しい説明は下の記事を参考にしてみてください。

【オススメのUdemy講座】BigQuery で学ぶ非エンジニアのための SQL データ分析入門

Bigquery初心者が学ぶための講座です。

11時間の動画教材でBigqueryの使い方からSQLの基礎まで網羅されているので基礎固めに受講しましょう。

受講はこちら

Bigqueryの料金体系

Bigqueryの料金公式ページはこちらです。

BigQuery には大きく2種類の課金対象があります。

・データ分析
 クエリによるデータ分析の計算量
・ストレージ

 Bigquery上に保存しているデータ保管料

それぞれ説明していきますね。

データ分析の計算量

料金の計算方法は下の表のようにシンプルです。

オペレーション料金詳細
クエリ(オンデマンド)$5.00 per TB毎月 1 TB まで無料です。
クエリ料金表

Bigquery上のクエリエディタにSQLのクエリを直接実行することでデータを分析ができます。そのクエリに対して1TBごとに約500円かかってきます。

また、下の画像のようにクエリを実行する際に、実行される計算量を確認することができるため莫大な金額がいきなり請求されることはまずないので安心してください。

Bigqueryの一部切り抜き

そして毎月1TBまでは無料でデータ処置ができます。これは企業でない限り使いきれない無料枠ですね笑

【BigQueryで学ぶ!SQLの基本:初学者からすらすらデータ抽出できるまで】

受講はこちら

ストレージ

ストレージはBigquery上に蓄積しているデータと考えてください。

以下の表がストレージに対する料金体系になります。

表のアクティブストレージとは「過去90日間で変更があったデータ」、長期保存とは「過去90日間で変更ないデータ」のことをさしています。

オペレーション料金詳細
アクティブストレージ$0.020 per GB毎月 10 GB まで無料。
長期保存$0.010 per GB毎月 10 GB まで無料。
ストレージ料金表

アクティブストレージであれば、1GBに対して約2円がかかります。

上の料金表を参考に、アクティブストレージでは以下の例ようにお金がかかってきます。

  • 100 MB を保存の月額料金は 0.2円
  • 500 GB を保存の月額料金は1000円
  • 1 TB を 保存の月額料金は 2000円

そして、BigQuery ではアクティブストレージと長期保存の両方で毎月10GBの無料枠があります。Bigqueryを少し試してみたい人には無料枠の10GBで十分かと思います。l

この料金体系は、クラウドストレージの中でもとても安いです。データ分析ではなくビッグデータの保管の目的にもBigqueryを利用するのもいいと思います。

Bigqueryを安全に安く使う方法

料金の上限を設定する

Bigqueryではデータ処理のバイト数の上限を設定することができます。

上限を超えるようなデータ処理を実行しようとするとエラーが出るため、自分の予算を超えたデータ処理が実行されてしまうミスは起きなくなり安全です。

以下が、データ処理のバイト数の上限設定の方法です。

クエリエディタの下の「その他」から「クエリの設定」をクリックします。

右に表示される設定画面の一番下にある「詳細オプション」を押し、「課金される最大バイト数」の項目に自身が設定したい最大のバイト数を入力すれば設定完了です。

安く処理する方法

分割・パーティション方法の公式サイトはこちらです。

BigQueryで大量のデータを解析する際は、分割とパーティションを使いましょう。

分割では「日付別テーブル」、パーティションでは「パーティショニングテーブル」を利用することになります。それぞれを紹介していきます。

分割
・日付別テーブル

パーティション
・取り込み時間で分割されたテーブル
分割テーブル

分割テーブルを使う

日付別テーブル

「日付別テーブル」は、日付別で別れる複数のテーブル群です。テーブル名に"_yyyymmdd"を付与することでBigqueryで自動的に別れます。一般的に「シャーディング」と呼ばれる技術です。

以下の画像はyyyymmddのテーブルを作ったものです。


日付別テーブルのメリットは単純さです。日付ごとに定期実行するバッチ処理での保存に便利ですね。

デメリットとしては、パーティションされたテーブルに比べて、クエリのパフォーマンスが低くなります。

また、日付別テーブルは、取り込み時間で分割されたテーブルへ変換することができます。

パーティションテーブルを使う

パーティショニングされたテーブルは、テーブルとしては1つですが、内部的にデータを分割(パーティションニング)することができます。

クエリの実行時にパーティションされた変数で指定すると、スキャン対象のデータサイズを削減できます。

パーティションテーブルには「取り込み時間で分割されたテーブル」と「分割テーブル」の2種類があります。

以下で2種類について説明していきます。

取り込み時間で分割されたテーブル

BigQueryがデータを取り込んだ日付でパーティションが作成されます。(1日1パーティション) 

以下の画像のようにテーブル作成時に、「取り込み時間により分割」を指定します。CSVやエクセルで取り込む際やクエリでテーブルを作成する時も有効です。

そして、取り込み時間は「_PARTITONTIME」として格納されているので、クエリで「_PARTITONTIME」を指定するとクエリの実行時間も短く、処理されるデータサイズも削減され、料金を抑えることができます

以下のクエリが実際の例になります。

SELECT * 
FROM `project_id.dataset_name.table_name` 
WHERE _PARTITIONTIME >= TIMESTAMP("2021-03-08")

タイムスタンプ(UTC)がこの列に格納されています。これを使ってデータを読み込むパーティションを指定します。

分割テーブル

分割テーブルでは、データのフィールドをユーザが指定し、パーティション変数を作成します。

具体的には、Web閲覧履歴を解析するとします。

WebのログデータのユーザがHPをアクセスした時刻が入るaccess_timeというフィールドを、テーブル作成時に、パーティションに使うフィールドとして指定します。

注意点ですが、パーティションに使うフィールドの型は、TIMESTAMP型かDATE型である必要があります。

以下のクエリが実際にaccess_timeをパーティションに指定するテーブル作成クエリです。

CREATE TABLE
  project.dataset.web_log
 (
  id,
  ip_address,
  date,
 )
PARTITION BY access_time # パーティションを指定
;

作成したテーブルに対しては、WHERE句にaccess_timeを指定すればOKです。

SELECT * 
  FROM `project.dataset.web_log` 
 WHERE access_time >= TIMESTAMP("2021-03-08")


まとめ

今回は、Bigqueryの料金体系とともに安全に安くデータ処理を行う方法を紹介しました。

分割テーブルを使う
・日付別テーブル

パーティションを使う
・取り込み時間で分割されたテーブル
分割テーブル

是非ともBigqueryを活用してデータ処理をしてみてくださいね。

  • この記事を書いた人
ぐぅ

ぐぅ

京大工学部▶︎京大大学院情報学研究科▶︎日系企業のITエンジニア。研究室ではAI×通信の研究も行いAIにも知見あり。友人とプログラミング初学者向けブログ「はやぶさエンジニア」を運営。ノーコードで起業し、サブスク型サービスを運営。26歳大阪在住

-Bigquery

© 2021 はやぶさエンジニア Powered by AFFINGER5