ビデオリサーチ公式テックブログ

ビデオリサーチ公式テックブログ

BigQueryのパーティションとは?IT部署1年目の社員が初心者向けに解説

こんにちは。ビデオリサーチのハコタニです。
私は今年4月からキャリアの中で初めてIT部署に異動になりました。わからないことだらけで悪戦苦闘しておりますが、世の中には私と同じようにIT未経験ながらIT部署への異動を告げられた方もいるのではないでしょうか?そこでIT初学者として、わからない人の目線で基礎的な内容を記事化していきたいと思います。

今回はBigQueryのパーティションがテーマです。BigQuery初心者向けにIT初学者ならではの目線で、パーティションの仕組み・種類・設定方法を解説します。知っておきたい基本用語の意味や使い方も丁寧に紹介し、GUI操作とSQLによるパーティションの設定手順を画面付きで詳しく説明します。

この記事がBigQuery初心者の皆さんにとって少しでもお役に立てれば幸いです。

1. BigQueryのパーティションとは?

パーティションとは、テーブルのデータを特定のルールで分割して保存する仕組みで、イメージしやすいように例えるなら「本棚の仕切り」です。
パーティションは、1つの大きな本棚(テーブル)に日付や範囲ごとに仕切りをつけるようなものです。仕切りがあることで、必要な本(データ)だけをすぐに取り出せるイメージです。

1-1. パーティションを使うメリット(コスト削減・高速化)

パーティションを使うと不要なデータを読み込む必要がなくなるので、以下のメリットがあります。

  • クエリの高速化:必要なデータだけを読み込む
  • コスト削減:スキャン量が減る=料金が安くなる

また、管理がしやすくなる(古いデータの削除や管理が簡単)という点もあります。

2. そもそもBigQueryとは?

そもそもBigQueryとは何か理解が怪しい人向けに解説します。※既に理解が進んでいる方は読み飛ばしていただいて構いません。

BigQueryとは、Googleが提供するクラウド型のデータベースサービスです。大量のデータを高速に分析できるのが特徴で、SQLという言語を使ってデータを検索・集計できます。

2-1. BigQueryの特徴

BigQueryの特徴として以下が挙げられます。

  • クラウド型:インストール不要。ブラウザからすぐ使える
  • 高速処理:数十億件のデータでも数秒で集計
  • 従量課金制:使った分だけ料金が発生

2-2. なぜBigQueryが選ばれるのか

BigQueryは、Googleが提供するクラウド型のデータ分析サービスですが、数あるデータベースの中でも特に人気があります。その理由は以下の3つの強みにあります。

1. スケーラビリティ(イメージ:倉庫の広さが自動で広がる仕組み)
スケーラビリティとは、データ量が増えてもシステムが問題なく動き続ける能力のことです。BigQueryは数百万〜数十億件のデータでも、自動で処理能力を拡張してくれるため、ユーザーは容量や性能を気にせず使えます。

2. コスト効率の良さ(従量課金)
BigQueryは、使った分だけ料金が発生する「従量課金制」です。 初心者目線だと、無料枠もあり学習や検証に最適で少量のデータから気軽に始められるのが魅力です。

3. SQL互換で学習コストが低い
BigQueryは、標準SQLに対応しています。すでにSQLを使ったことがある人はもちろん、初めて学ぶ人でも、他のデータベースと同じような文法で操作できるため、学習コストが低く済みます。

2-3. BigQueryを学ぶ上で知っておきたい基本用語と仕組み

BigQueryを使う上でよく出てくる単語をまとめました。

用語 意味 イメージ
アカウント Google Cloudを利用するためのユーザーID。GmailなどのGoogleアカウントと共通で、アクセス権や課金の管理に使われる。「誰が使っているか」を示す。 社員証やログインIDのようなもの
プロジェクト BigQueryや他のGoogle Cloudサービスを使うための「作業単位」。課金やアクセス管理の単位にもなる。「どこで作業しているか」を示すもの。 会社の中の「部署」や「チーム」
データセット テーブルをまとめるフォルダのようなもの 書類を入れる「引き出し」
テーブル 実際のデータが入っている表 Excelのシート
スキーマ テーブルの列の定義(名前・型など) 表の「見出し」
クエリ データを検索・集計する命令文 「この条件で探して」と頼む指示文
スキャン量 クエリで読み込むデータの量 倉庫から取り出すデータの重さ

BigQuery(Google Cloud)のリソース階層は以下の通りになります。

BigQuery(Google Cloud)のリソース階層
BigQuery(Google Cloud)のリソース階層

※個人利用の場合は「組織」に相当するリソースがなく、 Google アカウント(ログイン)直下にプロジェクトを作成します。今回はこのケースを想定して執筆しています。
以降の説明はデータセットまで作成されている前提で説明を進めていきます。

プロジェクト、データセット、テーブル

※以下の説明では下記テーブルを用いて説明を進めます。

カラム名 データ型
log_time DATETIME 2025/1/1 12:00
sale_date DATE 2025/1/1
user_id INTEGER 1
amount INTEGER 100
category STRING A

3. パーティションの種類と使い分け

パーティションの設定方法は3種類あります。

  1. 取り込み時間パーティション
  2. 日付/日時列によるパーティション
  3. 整数範囲パーティション

それぞれ特徴を見ていきましょう。

3-1. ① 取り込み時間パーティション

データがBigQueryに追加された日時をもとに、自動的にパーティションを分割する方式です。ユーザーが特定の列を指定しなくても、BigQueryが日単位でデータを分けて保存します。 想定されるケースとして、

  • ログデータ(アクセスログ、エラーログ)
  • IoTやセンサーからのストリーミングデータ
  • テーブル内に日付情報がなく、取り込んだタイミングで管理をしたい場合

などが挙げられます。

※データをテーブルに追加した日時をもとにパーティションを分割します。つまり、データが更新されない静的なテーブルではこのパーティションは不適切で、あくまでもデータが更新される動的なテーブルに対して有効です。

3-2. ② 日付/日時列によるパーティション

テーブル内の特定の列を指定して、その列の値(日付や日時)に基づいてパーティションを分割します。ユーザーが明示的に「この列で分けて」と指定する必要があります。

想定されるケースとして、

  • 売上データや予約データなど日付での分析が必要なデータ
  • イベントログや履歴データで発生日時が明確に記録されている場合

などが挙げられます。

3-3. ③ 整数範囲パーティション

整数範囲パーティションは、数値型の列を使って、指定した範囲と間隔でデータを分割する方式です。 想定されるケースとして、

  • ユーザーIDや商品IDなど数値でグループ化したいデータ
  • 年齢やスコアなど範囲ごとの集計や分析を行いたい場合

などが挙げられます。

4. BigQueryでのパーティション設定方法

画面上(GUI)で設定する方法とSQLでクエリを書いて設定する方法を説明します。

4-1. 画面上でパーティションを設定するための4つのSTEP

STEP①テーブルの作成

使用するデータセットを開き、「テーブルを作成」を選択します。選択後、使用するテーブルのデータ元を設定します。※画像はGCSに保存されてるcsvファイルから作成する画面です。

「テーブルを作成」を押下
参照するデータテーブルを指定する

STEP②送信式の設定

作成するテーブルの保存先を指定します。「プロジェクト」、「データセット」は自動反映されます。「テーブル」は任意のテーブル名を指定します(ここではdemo_tableと指定)。テーブルタイプは「ネイティブのテーブル」を指定します。

テーブル名を指定

STEP③スキーマの設定

作成するテーブルを定義します。自動検出(作成するデータをBigQuery側で自動解析して、フィールド名やデータ型を推測してくれる機能)か、手動で各フィールドを設定します。今回は手動で設定します。

スキーマの設定(画像は手動設定)

STEP④パーティショニングの設定

今回のメインテーマであるパーティショニングの設定を行います。パーティショニングの設定では「パーティショニングなし」、「取り込み時間により分割」、「フィールドにより分割」の選択できます。

このうち「取り込み時間により分割」は①取り込み時間パーティションに当たる部分です。設定できるのは1時間、1日、1か月、1年ごとです。

① 取り込み時間パーティション

「フィールドにより分割」は②、③に当たる部分です。「フィールドを選択」から設定したいフィールドを選択し、パーティショニングタイプから設定するパーティショニングを設定します。 ②日付/日時列によるパーティションと③整数範囲パーティションはデータ型が異なることで設定方法が異なります。 ②のパーティショニングタイプは1時間、1日、1か月、1年ごと(DATE型なら1日ごとのみ)、③は「開始」、「終了」の項目で選択したフィールドの最小値、最大値を、「間隔」でパーティションの間隔を設定します。画像は②の方法でlog_timeの項目で「1日ごと」設定、③の方法でuser_idを20ずつに分割する場合の設定です。

② 日付/日時列によるパーティション
③ 整数範囲パーティション

最後に画面下部の「テーブルを作成」を押下します。

※「フィールドにより分割」はスキーマを手動設定しないと利用できません。

補足①「データのクエリで WHERE 句を必須にする」とは?

設定画面上、パーティショニング フィルタ 「データのクエリで WHERE 句を必須にする」というチェックボックスがあります。こちらは、「WHERE句でパーティション列を指定しないとクエリを実行できないようにする」という設定です。パーティションの設定漏れを防ぎ、意図せぬ処理の重いクエリが走ることを防ぎます。初心者の場合は設定しておくことをおすすめします。 ※WHERE句:SQLでどの条件でデータを取り出すか?を指定する記述

補足②「クラスタの設定」とは?

こちらも設定画面上に存在しているかと思います。クラスタリングというクエリパフォーマンスを向上させるために指定した列のデータを整理する機能です。パーティションがデータを日付や範囲で分類するのに対し、クラスタパーティションの中をさらに整理する仕組みです。データ量が多い場合などで活用したい機能です。

4-2. SQLパーティションを設定するための2つのSTEP

こちらの手順もテスト用のcsvファイルから作成する手順を説明します。

STEP①GCSをファイルにアップロード

任意のバケットcsvファイルをアップロードします。

STEP②SQLの実行

以下のSQLをBigQueryのクエリエディタで実行します。今回はsale.date(DATE型)を使って「② 日付/日時列によるパーティション」を作成します。

  
-- テーブルを新しく作成
CREATE  TABLE `プロジェクトID.データセット名.テーブル名`
-- テーブル内のフィールドを定義*
(
-- ログの日時(日時型)
  log_time DATETIME,
-- 売上日(日付型)→ パーティションに使用
  sale_date DATE,
-- ユーザーID(整数型)
  user_id INT64,
-- 売上金額(整数型)
  amount INT64,
-- 商品カテゴリ(文字列型)
  category STRING
)
-- sale_date列を使って日付ごとにパーティション分割
PARTITION BY sale_date;
-- GCSのCSVファイルからデータを読み込む
LOAD DATA INTO `プロジェクトID.データセット名.テーブル名`
FROM FILES (
-- ファイル形式はCSV
  format = 'CSV',
-- 読み込むファイルの場所(GCSのバケット)
  uris = ['gs://バケット名/ファイル名'],
-- 1行目はヘッダー(列名)なので読み飛ばす
  skip_leading_rows = 1
);
  

上記のように「PARTITION BY パーティションを設定する列名」で記述することで、SQLパーティションを設定できます。

なお、上記の例は日付型に対して、日ごとにパーティションを設定する例です。例えば、DATETIME 型のlog_timeに対して日ごとのパーティションを設定する場合、DATETIME_TRUNCという関数を使って、「PARTITION BY DATETIME_TRUNC(log_time, DAY)」と記述します。これは時間を切り捨てて日付だけにするという関数です。(イメージ:2025-01-01 09:00:00⇒2025-01-01 00:00:00)これにより、同じ日のデータが同じパーティションにまとめられます。※DATE型の場合はPARTITION BY DATE_TRUNC(列名,パーティション単位)となります。

補足①日付以外でパーティションを設定する場合

①取り込み時間パーティション、③整数範囲パーティションも設定可能です。①取り込み時間で設定する場合は「PARTITION BY _PARTITIONTIME 」※1、③整数範囲でパーティションを設定する場合は、「PARTITION BY RANGE_BUCKET(user_id, GENERATE_ARRAY(0, 100, 20))」※2と記述します。

※1 整数型であることが必須です。

※2 GENERATE_ARRAY(0, 100, 20) は、BigQueryのSQL関数のひとつで、指定した範囲の整数を一定の間隔で並べた配列を作る関数です。※GENERATE_ARRAY(開始値, 終了値, 間隔)

4-3. 設定方法の使い分け

どちらで設定すればいいのか

GUI上で設定する方法とSQLで設定する方法の使い分けは以下のように考えるのが一般的です。 GUIでのパーティション設定が向いているケース

  • 初めてBigQueryを使う場合
  • 小規模なテーブルや一時的なテーブルを作成する場合
  • 設定内容をすぐに確認・変更したい場合

SQLでのパーティション設定が向いているケース

  • 本番環境でのテーブル作成
  • チームでの開発や運用(バージョン管理が可能)
  • インフラ構成をコードで管理する(再利用ができる)

初心者はGUIで設定することから始める方がおすすめです。

補足①パーティショニングの設定は後から変更可能?

結論から言うと、テーブル作成後にパーティションを設定、変更することは不可能です。データ構造が変わってしまうため、テーブル設計時に設定する必要があります。もし後から設定変更する場合は、新規にテーブルを作り直したり、作成したテーブルのデータをパーティションが設定されたテーブルにコピーするなどの対応が必要になります。

補足②パーティショニングの上限数とは?

Big Quelyで設定できるパーティションには制限がいくつかあります。最後にそちらを紹介します。

1つのテーブルに作れるパーティションの数は10000個です。仮に1日ごとのパーティションを設定した場合、1テーブルに約27年分のデータが搭載可能です。

1回あたり処理できるパーティション数も決まっており、4000個が上限になります。仮に1テーブルにおいて5000個のパーティションが設定されても、1回のクエリ処理で全てのテーブルを参照することはできません。

このように設定できるパーティションには上限があります。データ量の少ない場合は気にする必要はありませんが、イベントログなど、データ量が膨大になる場合はパーティションの設定をよく考えて設計する必要があります。

まとめ

いかがでしょうか。今後データ量が大きくなくとも、是非パーティションを意識してテーブル設計を意識してみてください。まずは初めて使う人やまだ慣れていない人は画面から設定する操作から慣れてみてください。