ラボの設定手順と要件
アカウントと進行状況を保護します。このラボを実行するには、常にシークレット ブラウジング ウィンドウとラボの認証情報を使用してください。

Snowflake プロフェッショナル向けの BigQuery テーブル スキーマの設計

ラボ 1時間 universal_currency_alt クレジット: 5 show_chart 入門
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
このコンテンツはまだモバイル デバイス向けに最適化されていません。
快適にご利用いただくには、メールで送信されたリンクを使用して、デスクトップ パソコンでアクセスしてください。

概要

BigQuery では、データを BigQuery データセットに整理し、列名とデータ型を使用して各テーブルのスキーマ(または構造)を定義します。テーブルのスキーマは、BigQuery がテーブル内のデータにアクセスして処理する速度と効率を左右するため、BigQuery のクエリのパフォーマンスと費用に影響を与える場合があります。BigQuery は柔軟なスキーマをサポートしており、データを書き換えることなくスキーマを変更できます。

このラボの目的は、Snowflake のプロフェッショナルが効果的な BigQuery テーブル スキーマの設計と実装を開始するうえで必要な知識とスキルを提供することです。このラボを完了すると、Snowflake のプロフェッショナルは、BigQuery でテーブル スキーマを設計、最適化、クエリする方法についてより深く理解できるようになります。

このラボでは、データを保存する BigQuery データセットとテーブルを作成し、非正規化されたデータの関係を維持するネストされたフィールドと繰り返しフィールドを作成し、クエリのパフォーマンスを最適化するためにパーティション分割テーブルとクラスタ化テーブルを作成します。

Snowflake から BigQuery への SQL の変換について詳しくは、Snowflake から BigQuery への SQL 変換ガイド(https://cloud.google.com/bigquery/docs/migration/snowflake-sql)をご覧ください。

目標

このラボでは、次の方法について学びます。

  • BigQuery でデータセットとテーブルを作成する。
  • BigQuery でネストされたフィールドと繰り返しフィールドを作成してクエリを実行する。
  • BigQuery でパーティション分割テーブルを作成してクエリを実行する。
  • BigQuery でクラスタ化テーブルを作成してクエリを実行する。

設定と要件

各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。

  1. シークレット ウィンドウを使用して Google Skills にログインします。

  2. ラボのアクセス時間(例: 1:15:00)に注意し、時間内に完了できるようにしてください。 一時停止機能はありません。必要な場合はやり直せますが、最初からになります。

  3. 準備ができたら、[ラボを開始] をクリックします。

  4. ラボの認証情報(ユーザー名パスワード)をメモしておきます。この情報は、Google Cloud コンソールにログインする際に使用します。

  5. [Google コンソールを開く] をクリックします。

  6. [別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。 他の認証情報を使用すると、エラーや料金が発生します。

  7. 利用規約に同意し、再設定用のリソースページをスキップします。

ラボを開始してコンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側のパネルには、このラボで使用する必要がある一時的な認証情報が表示されます。

    [認証情報] パネル

  2. ユーザー名をコピーし、[Google Console を開く] をクリックします。 ラボでリソースが起動し、別のタブで [アカウントの選択] ページが表示されます。

    注: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
  3. [アカウントの選択] ページで [別のアカウントを使用] をクリックします。[ログイン] ページが開きます。

    [別のアカウントを使用] オプションがハイライト表示されている、アカウントのダイアログ ボックスを選択します。

  4. [接続の詳細] パネルでコピーしたユーザー名を貼り付けます。パスワードもコピーして貼り付けます。

注: 認証情報は [接続の詳細] パネルに表示されたものを使用してください。Google Skills の認証情報は使用しないでください。請求が発生する事態を避けるため、Google Cloud アカウントをお持ちの場合でも、このラボでは使用しないでください。
  1. その後次のように進みます。
  • 利用規約に同意します。
  • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
  • 無料トライアルには登録しないでください。

しばらくすると、このタブで Cloud コンソールが開きます。

注: 左上にある [ナビゲーション メニュー] をクリックすると、Google Cloud のプロダクトやサービスのリストが含まれるメニューが表示されます。 Cloud コンソール メニュー

タスク 1. BigQuery データセットとテーブルを作成する

BigQuery では、データ定義言語(DDL)を使用してデータセットとテーブルを作成できます。また、SQL ステートメント LOAD DATA を使用して、1 つ以上のファイルから、データを新規または既存のテーブルに読み込むこともできます。

DDL ステートメントを使用して BigQuery データセットとテーブルを作成する方法、および LOAD DATA SQL ステートメントを使用してデータを読み込む方法について詳しくは、CREATE SCHEMA ステートメントCREATE TABLE ステートメントLOAD DATA ステートメントに関するドキュメントをご覧ください。

このタスクでは、DDL を使用して BigQuery にデータセットとテーブルを作成し、LOAD DATA ステートメントを使用して新しいテーブルにデータを読み込みます。

  1. Google Cloud コンソールのナビゲーション メニューナビゲーション メニュー)で、[アナリティクス] の下の [BigQuery] をクリックします。

[Cloud Console の BigQuery へようこそ] メッセージ ボックスが開きます。このメッセージ ボックスには、クイックスタート ガイドとリリースノートへのリンクが表示されます。

  1. [完了] をクリックします。

  2. SQL ワークスペースのツールバーで、[エディタ] アイコンをクリックして SQL クエリエディタを開きます。

bq_editor.PNG

  1. クエリエディタに以下のクエリをコピーして貼り付け、[実行] をクリックします。
CREATE SCHEMA IF NOT EXISTS ticket_sales OPTIONS( location="us");

このクエリは、ticket_sales という名前の新しい BigQuery データセットを作成します。DDL ステートメントでは、SCHEMA という用語はテーブル、ビュー、その他のリソースの論理的なコレクションを指します。これは BigQuery ではデータセットと呼ばれます。

bq_dataset_created.PNG

  1. データセットが一覧表示されている [エクスプローラ] ペイン(左側)を開き、データセット名 ticket_sales をクリックして、先ほどのデータセットが正常に作成されたことを確認します。

bq_goto_ticket_sales.PNG

  1. [クエリエディタ] ペインで、次のクエリを実行します。
CREATE OR REPLACE TABLE ticket_sales.sales( salesid INT64, listid INT64, sellerid INT64, buyerid INT64, eventid INT64, dateid INT64, qtysold INT64, pricepaid INT64, commission FLOAT64, saletime STRING);

このクエリは、ticket_sales データセットに sales という名前の新しいテーブルを作成します。

bq_statement_created.PNG

  1. データセットとテーブルが一覧表示されている [エクスプローラ] ペインを開き、テーブル名 sales をクリックします。

  2. [詳細] タブと [プレビュー] タブをクリックして、テーブルの詳細情報を確認します。

テーブルにはまだデータがないことに注目してください。

  1. [クエリエディタ] ペインで、次のクエリを実行します。
LOAD DATA INTO ticket_sales.sales ( salesid INT64, listid INT64, sellerid INT64, buyerid INT64, eventid INT64, dateid INT64, qtysold INT64, pricepaid INT64, commission FLOAT64, saletime STRING ) FROM FILES ( skip_leading_rows=1, format = 'CSV', field_delimiter = ',', max_bad_records = 10, uris = ['gs://tcd_repo/data/entertainment_media/ticket-sales/sales.csv']);

このクエリでは、明示的なテーブル スキーマ定義を使用して、Cloud Storage の CSV ファイルから sales テーブルにデータを読み込みます。

[結果] ペインに、LOAD ステートメントが正常に実行されたことを示すメッセージが表示されます。

bq_data_loaded.PNG

  1. [エクスプローラ] ペインで、[詳細] タブと [プレビュー] タブをクリックして、データが sales テーブルに読み込まれたことを確認します。

[プレビュー] タブのデータを更新するには、[更新](右上)をクリックします。

bq_sales_details.PNG

bq_sales_preview1.PNG

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 BigQuery データセットとテーブルを作成する

ここまでで、BigQuery で SQL ステートメントを使用してデータセットとテーブルを作成し、データを読み込みました。別のテーブルを作成して、イベント情報のデータを読み込む練習をしましょう。

  1. クエリエディタで、次のクエリを実行して events という名前の新しいテーブルを作成します。
CREATE OR REPLACE TABLE ticket_sales.events( eventid INT64, venueid INT64, catid INT64, dateid INT64, eventname STRING, starttime TIMESTAMP);

bq_new_table_events.PNG

  1. [エクスプローラ] ペインを確認し、salesevents という 2 つのテーブルがあることを確認します。

bq_new_events_table_explorer.PNG

  1. クエリエディタで、次のクエリを実行してデータを events テーブルに読み込みます。
LOAD DATA INTO ticket_sales.events FROM FILES ( skip_leading_rows=1, format = 'CSV', field_delimiter = ',', max_bad_records = 10, uris =['gs://tcd_repo/data/entertainment_media/ticket-sales/events.csv']);

このクエリは、スキーマの自動検出を使用して、Cloud Storage の CSV ファイルから events テーブルにデータを読み込みます。

[結果] ペインに、LOAD ステートメントが正常に実行されたことを示すメッセージが表示されます。

bq_new_events_loaded.PNG

  1. [詳細] タブと [プレビュー] タブをクリックして、データが events テーブルに読み込まれたことを確認します。

[プレビュー] タブのデータを更新するには、[更新](右上)をクリックします。

bq_events_preview.PNG

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 events テーブルにデータを読み込む

タスク 2. ネストされたフィールドと繰り返しフィールドを作成してクエリする

非正規化は、以前に正規化されたリレーショナル データセットの読み取りパフォーマンスを向上させるための一般的な手法です。BigQuery でデータを非正規化するために推奨される方法は、ネストされたフィールドと繰り返しフィールドを使用することです。データを完全にフラット化するのではなく、ネストされたフィールドと繰り返しフィールドを使用して、非正規化されたデータの関係を維持できます。

BigQuery のネストされたフィールドと繰り返しフィールドの詳細については、ネストされ繰り返されているフィールドを使用するをご覧ください。

このタスクでは、BigQuery でネストされたフィールドと繰り返しフィールドを作成してクエリを実行する方法を学習します。

  1. [クエリエディタ] ペインで、次のクエリを実行します。
SELECT e.eventid, e.eventname, s.saletime, s.qtysold, s.pricepaid, s.commission FROM ticket_sales.events e JOIN ticket_sales.sales s ON e.eventid = s.eventid ORDER BY eventid, eventname;

bq_repeated_fields.PNG

注: events テーブルと sales テーブルの間には、1 対多の関係があります。このクエリを実行すると、1 対多の関係の「1」側のデータが繰り返し表示されます。つまり、各 sale(販売)に対して event(イベント)が重複して出力されます。重複を削除するには、sales のデータを 1 つの配列に集約します。
  1. [クエリエディタ] ペインで、次のクエリを実行します。
SELECT e.eventid, e.eventname, ARRAY_AGG(STRUCT( s.saletime, s.qtysold, s.pricepaid, s.commission)) as sales FROM ticket_sales.events e JOIN ticket_sales.sales s ON e.eventid = s.eventid GROUP BY eventid, eventname ORDER BY eventid, eventname;

ステップ 2 の SQL はステップ 1 の SQL と似ていますが、ARRAY_AGG 関数、STRUCT 関数、GROUP BY 関数が追加されていることに注目してください。

  1. クエリ結果を確認します。

1 対多の関係の「1」側のデータが繰り返される代わりに、「多」側のデータが 1 つの構造体の配列に含まれるようになりました。

bq_removed_repetition.PNG

また、前のクエリを CREATE TABLE ステートメントでラップして、ネストされた階層テーブルを作成することもできます。

  1. [クエリエディタ] ペインで、次のクエリを実行します。
CREATE OR REPLACE TABLE ticket_sales.event_sales as ( SELECT e.eventid, e.eventname, ARRAY_AGG(STRUCT( s.saletime, s.qtysold, s.pricepaid, s.commission)) as sales FROM ticket_sales.events e JOIN ticket_sales.sales s ON e.eventid = s.eventid GROUP BY eventid, eventname );

bq_event_sales_table_created.PNG

  1. [テーブルに移動] をクリックし、テーブル スキーマを確認します。

スキーマには、ネストされた繰り返しフィールド sales が含まれています。このフィールドには、各イベント販売の販売時間、販売数量、支払い価格、手数料が含まれています。

bq_event_sales_schema_2.png

この新しいネストされた繰り返し構造により、クエリの書き方が変わります。

  1. イベント別の販売数をカウントするには、次のクエリを実行します。
SELECT eventid, eventname, ARRAY_LENGTH(sales) AS sale_count FROM ticket_sales.event_sales ORDER BY sale_count DESC;

bq_sales_count.PNG

イベントごとの上位の手数料を確認したい場合はどうすればよいでしょうか?これには、配列内でのクエリが必要になります。そのためには、配列のネストを解除(またはフラット化)する必要があります。

  1. 配列をネスト解除し、イベントごとの上位 2 つの手数料を特定するには、次のコマンドを実行します。
SELECT eventid, eventname, ARRAY((SELECT AS STRUCT saletime, commission FROM UNNEST(sales) ORDER BY(commission) DESC LIMIT 2)) as top_2 FROM ticket_sales.event_sales ORDER BY eventid;

sales 配列をフラット化してクエリできるようにするには、UNNEST 演算子を使用します。これによって、クエリの結果は配列に変換されます。

bq_top_commissions.PNG

UNNEST を使用して配列をフラット化する方法について詳しくは、UNNEST 演算子に関するドキュメントをご覧ください。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 ネストされたフィールドと繰り返しフィールドを作成してクエリを実行する

タスク 3. パーティション分割テーブルを作成してクエリを実行する

BigQuery でクエリによって処理されるバイト数を減らす方法の一つは、大きなテーブルをパーティションと呼ばれる小さなセグメントに分割し、適切なパーティションのデータのみが読み込まれるようにクエリにフィルタを含めることです。このプロセスはパーティション プルーニングと呼ばれ、クエリの費用を削減するために使用できます。

パーティション分割テーブルとパーティション プルーニングについて詳しくは、パーティション分割テーブルの概要パーティション分割テーブルに対するクエリをご覧ください。

このタスクでは、時間単位のパーティション分割テーブル(基準は DATETIME 列)を作成してクエリを実行することで、クエリで処理されるバイト数を最小限に抑える方法を学習します。

  1. クエリエディタに次のコードを貼り付けますが、[実行] はクリックしないでください。
SELECT * FROM ticket_sales.sales;

クエリを実行する前に、BigQuery クエリ検証ツールによって、クエリで処理されるバイト数の見積もりが表示されます。このクエリの見積もりバイト数(15.12 MB)を確認します。

bq_ticket_sales_bytes.PNG

  1. 次のクエリを貼り付けますが、[実行] はクリックしないでください。
SELECT * FROM ticket_sales.sales WHERE saletime = '12/14/2008 09:13:17';

bq_ticket_sales_time_bytes.PNG

新しいクエリでは特定の日付の販売情報のみをリクエストしているにもかかわらず、処理されるバイト数がステップ 1 のクエリと同じ(15.12 MB)であることに注目してください。

  1. saletime 列で日別にパーティション分割された新しい sales テーブルを作成するには、次のクエリを実行します。
CREATE OR REPLACE TABLE ticket_sales.sales_partitioned_by_date PARTITION BY DATETIME_TRUNC(saletime, DAY) AS ( SELECT * except (saletime), PARSE_DATETIME( "%m/%d/%Y %H:%M:%S", saletime) as saletime FROM ticket_sales.sales );

bq_sales_partitioned_by_date_created.PNG

  1. [詳細] タブをクリックして、テーブルが saletime という名前の列で、日別でパーティション分割されていることを確認します。

bq_sales_partitioned_field.PNG

  1. 次のクエリを貼り付け、処理されるデータ量の見積もりが低くなっている(18.98 KB)ことに注目してください。
SELECT * FROM ticket_sales.sales_partitioned_by_date WHERE saletime = parse_datetime("%m/%d/%Y %H:%M:%S", '12/14/2008 09:13:17');
  1. [実行] をクリックしてクエリ結果を取得します。

クエリはパーティション分割テーブルに対して実行されるため、処理するデータ量が少なくなります(18.98 KB)。BigQuery ではパーティション プルーニングを使用して処理するデータ量を減らすことができるため、コストを削減し、クエリを高速化できます。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 パーティション分割テーブルを作成してクエリを実行する

タスク 4. クラスタ化テーブルを作成してクエリを実行する

BigQuery でクエリ パフォーマンスを最適化する別の方法は、テーブル内の値をクラスタ化して、データを論理ストレージ ブロックに並べ替えてグループ化することです。クラスタ列でフィルタや集計を行うクエリは、テーブルやテーブル パーティション全体ではなく、クラスタ列に基づいて関連するブロックのみをスキャンします。このプロセスはブロック プルーニングと呼ばれ、結合、検索、グループ化、並べ替えを高速化できます。

クラスタ化テーブルとブロック プルーニングの詳細については、クラスタ化テーブルの概要クラスタ化テーブルのクエリをご覧ください。

このタスクでは、クエリのパフォーマンスが最適化されるように、クラスタ化テーブルを作成してクエリを実行する方法を学習します。

  1. [クエリエディタ] ペインで、次のクエリを実行します。
SELECT LANGUAGE, COUNT(views) AS views FROM `cloud-training-demos.wikipedia_benchmark.Wiki1B` GROUP BY LANGUAGE ORDER BY views DESC;

bq_count_by_views.PNG

このクエリでは、大量のデータ(この場合は 10 億行)を含む Google の一般公開データセットの 1 つを使用し、Wikipedia データのテーブルで言語ごとの閲覧数をカウントします。

  1. [結果] ペインで、[実行の詳細] タブをクリックします。

シャッフルされたバイト数(619.68 KB)を確認します。

bq_bytes_shuffled.PNG

  1. Wikipedia データ用の新しいデータセットを作成するには、次のクエリを実行します。
CREATE SCHEMA IF NOT EXISTS wiki_clustered OPTIONS( location="us");
  1. language 列を基準としてクラスタ化されたテーブルを作成するには、次のクエリを実行します。
CREATE OR REPLACE TABLE wiki_clustered.Wikipedia_by_language CLUSTER BY language AS ( SELECT * FROM `cloud-training-demos.wikipedia_benchmark.Wiki1B`);

このコマンドの実行には数分かかることがあります。

bq_wiki_clustered_dataset_created.PNG

  1. テーブルの [詳細] タブを確認し、language という名前の列でクラスタ化されていることを確認します。

bq_wikipedia_by_lang_details.PNG

  1. クラスタ化テーブルをクエリするには、次のクエリを実行します。
SELECT LANGUAGE, COUNT(views) AS views FROM wiki_clustered.Wikipedia_by_language GROUP BY language ORDER BY views DESC;

bq-select_count_clustered.PNG

  1. [結果] ペインで、[実行の詳細] タブをクリックします。

同じクエリをクラスタ化テーブルに対して実行すると、シャッフルされるバイト数が少なくなる(47.98 KB)ことに注目してください。シャッフルされるバイト数が少ないほど、BigQuery での実行時間が短くなります。

bq_reduced_bytes_shuffled.PNG

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 クラスタ化テーブルを作成してクエリを実行する

ラボを終了する

ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Skills から削除され、アカウントの情報も消去されます。

ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。

星の数は、それぞれ次の評価を表します。

  • 星 1 つ = 非常に不満
  • 星 2 つ = 不満
  • 星 3 つ = どちらともいえない
  • 星 4 つ = 満足
  • 星 5 つ = 非常に満足

フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。

フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。

Copyright 2026 Google LLC All rights reserved. Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

コンソールにログインする

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボを実行するには、シークレット モードまたはシークレット ブラウジング ウィンドウを使用することをおすすめします。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。