ビューを作成する

このドキュメントでは、BigQuery でビューを作成する方法について説明します。

BigQuery では、以下の方法でビューを作成できます。

  • Cloud Console または従来の BigQuery ウェブ UI を使用する
  • コマンドライン ツールの bq mk コマンドを使用する
  • tables.insert API メソッドを呼び出す
  • クライアント ライブラリを使用する
  • CREATE VIEW データ定義言語(DDL)ステートメントを送信する

ビューの命名

BigQuery でビューを作成する場合、ビュー名はデータセットごとに一意にする必要があります。ビュー名には次の制限があります。

  • 1,024 文字以内
  • 英字(大文字または小文字)、数字、アンダースコアだけが含まれている

ビューの制限

BigQuery ビューには次の制限があります。

  • ビューを含むデータセットと、そのビューによって参照されているテーブルを含むデータセットは、同じロケーションに存在する必要があります。
  • ビューからデータをエクスポートする BigQuery ジョブは実行できません。
  • TableDataList JSON API メソッドを使用してビューからデータを取得することはできません。詳細については、Tabledata: list をご覧ください。
  • ビューを使用するときは、標準 SQL クエリとレガシー SQL クエリを併用できません。標準 SQL クエリでは、レガシー SQL 構文で定義したビューを参照できません。
  • ビューでクエリ パラメータを参照することはできません。
  • ビューを作成すると、元のテーブルのスキーマがビューと一緒に保存されます。ビューの作成後に列の追加や削除などを行うと、ビューを更新するまでは正確なスキーマが報告されません。報告されるスキーマが正確でない場合でも、送信されたクエリは正しい結果を出力します。
  • レガシー SQL ビューを標準 SQL 構文に自動的に更新することはできません。ビューの定義に使用されるクエリを変更するには、Cloud Console または従来の BigQuery ウェブ UI の [クエリの編集] オプション、bq コマンドライン ツールでの bq update --view コマンド、クライアント ライブラリ、update または patch の API メソッドのいずれかを使用します。
  • ビューを定義する SQL クエリには、一時的なユーザー定義関数または一時テーブルを含めることはできません。
  • ワイルドカード テーブルクエリでビューを参照することはできません。

ビューに適用される割り当てと上限については、ビューの上限をご覧ください。

必要な権限

ビューは BigQuery でテーブル リソースとして扱われるため、ビューを作成するにはテーブルの作成と同じ権限が必要です。ビューを作成するユーザーには、少なくとも bigquery.tables.create 権限が付与されている必要があります。bigquery.tables.create 権限は、事前定義された以下の Cloud IAM の役割に含まれています。

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

また、bigquery.datasets.create 権限を持つユーザーがデータセットを作成すると、そのデータセットに対する bigquery.dataOwner アクセス権がユーザーに付与されます。bigquery.dataOwner アクセス権により、データセットに含まれるビューの作成が許可されます。

BigQuery での Cloud IAM の役割と権限については、事前定義された役割と権限をご覧ください。

ビューの作成

ビューを作成するには、ビューにアクセス可能なデータを定義する SQL クエリを作成します。

ビューの作成に使用する標準 SQL クエリには、テーブルのプロジェクト ID を含め、`project_id.dataset.table` の形式でビューの参照を含める必要があります。標準 SQL では、別のプロジェクトからビューがクエリされたときのあいまいさを避けるため、明示的なプロジェクト ID が必要です。

ビューを作成するには:

Console

  1. クエリを実行した後、クエリ結果ウィンドウの上にある [ビューを保存] ボタンをクリックして、クエリをビューとして保存します。

    ビューを保存。

  2. [ビューの保存] ダイアログで、次の操作を行います。

    • [プロジェクト名] で、ビューを保存するプロジェクトを選択します。
    • [データセット名] で、ビューを含むデータセットを選択します。 ビューを含むデータセットと、そのビューによって参照されているテーブルを含むデータセットは、同じロケーションに存在する必要があります。
    • [テーブル名] に、ビューの名前を入力します。
    • [保存] をクリックします。

従来の UI

  1. クエリを実行した後、クエリ結果ウィンドウの [Save View] ボタンをクリックし、結果をビューとして保存します。

    ビューを保存。

  2. [Save View] ダイアログで、次の操作を行います。

    • [Project] で、ビューを保存するプロジェクトを選択します。
    • [Dataset] で、ビューを格納するデータセットを選択します。ビューを含むデータセットと、そのビューによって参照されているテーブルを含むデータセットは、同じロケーションに存在する必要があります。
    • [Table ID] に、ビューの名前を入力します。
    • [OK] をクリックします。

bq

mk コマンドを使用し、--view フラグを指定します。標準 SQL クエリを使用する場合は、--use_legacy_sql フラグを追加して false に設定します。オプション パラメータには --expiration--description--label があります。

Cloud Storage またはローカル ファイルに格納されている外部のユーザー定義関数リソースをクエリで参照する場合は、--view_udf_resource フラグを使用してリソースを指定します。--view_udf_resource フラグはここでは説明しません。UDF の使用方法の詳細については、標準 SQL ユーザー定義関数をご覧ください。

デフォルト プロジェクト以外のプロジェクトにビューを作成する場合は、--project_id フラグを使用してプロジェクト ID を指定します。

bq mk \
--use_legacy_sql=false \
--view_udf_resource=path_to_file \
--expiration integer \
--description "description" \
--label key:value \
--view 'query' \
--project_id project_id \
dataset.view

ここで

  • path_to_file は、ビューで使用されるユーザー定義関数リソースとして読み込まれ、すぐに評価されるコードファイルの URI またはローカル ファイル システムのパスです。フラグを繰り返して複数のファイルを指定します。
  • integer は、ビューのデフォルトの存続期間(秒)です。最小値は 3,600 秒(1 時間)です。現在時刻にこの整数値を足した値が有効期限になります。ビューの作成時に有効期限を設定した場合、データセットのデフォルトのテーブル有効期限設定は無視されます。
  • description はビューの説明であり、引用符で囲みます。
  • key:value は、ラベルを表す Key-Value ペアです。複数のラベルを指定するには、--label フラグを繰り返します。
  • query は有効なクエリです。標準 SQL ビューでは、クエリには、テーブルのプロジェクト ID を含め、`[PROJECT_ID].[DATASET].[TABLE]` の形式でビューの参照を含める必要があります。
  • project_id はプロジェクト ID です(デフォルトのプロジェクトが構成されていない場合)。
  • dataset は、プロジェクトのデータセットです。
  • view は、作成するビューの名前です。

例:

デフォルト プロジェクトにある mydataset 内に myview という名前のビューを作成するには、次のコマンドを入力します。有効期間は 3,600 秒(1 時間)、説明は This is my view、ラベルは organization:development に設定されます。ビューの作成に使用されるクエリは、USA Name データ一般公開データセットのデータを照会します。

bq mk \
--use_legacy_sql=false \
--expiration 3600 \
--description "This is my view" \
--label organization:development \
--view \
'SELECT
  name,
  number
FROM
  `bigquery-public-data.usa_names.usa_1910_current`
WHERE
  gender = "M"
ORDER BY
  number DESC' \
mydataset.myview

次のコマンドを入力して、myotherprojectmydatasetmyview という名前のビューを作成します。有効期間は 3,600 秒(1 時間)、説明は This is my view、ラベルは organization:development に設定されます。ビューの作成に使用されるクエリは、USA Name データ一般公開データセットのデータを照会します。

bq mk \
--use_legacy_sql=false \
--expiration 3600 \
--description "This is my view" \
--label organization:development \
--project_id myotherproject \
--view \
'SELECT
  name,
  number
FROM
  `bigquery-public-data.usa_names.usa_1910_current`
WHERE
  gender = "M"
ORDER BY
  number DESC' \
mydataset.myview

ビューを作成した後、ビューの有効期限、説明、ラベルを更新できます。詳細については、ビューの更新をご覧ください。

API

view プロパティを含む テーブル リソースを使用して、tables.insert メソッドを呼び出します。

Go

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Go の手順に従って設定を行ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// createView demonstrates creation of a BigQuery logical view.
func createView(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydatasetid"
	// tableID := "mytableid"
	ctx := context.Background()

	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	meta := &bigquery.TableMetadata{
		// This example shows how to create a view of the shakespeare sample dataset, which
		// provides word frequency information.  This view restricts the results to only contain
		// results for works that contain the "king" in the title, e.g. King Lear, King Henry V, etc.
		ViewQuery: "SELECT word, word_count, corpus, corpus_date FROM `bigquery-public-data.samples.shakespeare` WHERE corpus LIKE '%king%'",
	}
	if err := client.Dataset(datasetID).Table(tableID).Create(ctx, meta); err != nil {
		return err
	}
	return nil
}

Node.js

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。

// Import the Google Cloud client library and create a client
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function createView() {
  // Creates a new view named "my_shared_view" in "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const myDatasetId = "my_table"
  // const myTableId = "my_table"
  // const projectId = "bigquery-public-data";
  // const sourceDatasetId = "usa_names"
  // const sourceTableId = "usa_1910_current";
  const myDataset = await bigquery.dataset(myDatasetId);

  // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
  const options = {
    view: `SELECT name
    FROM \`${projectId}.${sourceDatasetId}.${sourceTableId}\`
    LIMIT 10`,
  };

  // Create a new view in the dataset
  const [view] = await myDataset.createTable(myTableId, options);

  console.log(`View ${view.id} created.`);
}

Python

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Python の手順に従って設定を行ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

# from google.cloud import bigquery
# client = bigquery.Client()
# project = 'my-project'
# source_dataset_id = 'my_source_dataset'
# source_table_id = 'us_states'
# shared_dataset_ref = client.dataset('my_shared_dataset')

# This example shows how to create a shared view of a source table of
# US States. The source table contains all 50 states, while the view will
# contain only states with names starting with 'W'.
view_ref = shared_dataset_ref.table("my_shared_view")
view = bigquery.Table(view_ref)
sql_template = 'SELECT name, post_abbr FROM `{}.{}.{}` WHERE name LIKE "W%"'
view.view_query = sql_template.format(project, source_dataset_id, source_table_id)
view = client.create_table(view)  # API request

print("Successfully created view at {}".format(view.full_table_id))

ビューを作成したら、テーブルと同じ方法でビューにクエリを実行します。

次のステップ