ビューを作成する

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

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

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

ビューの制限

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

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

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

始める前に

このドキュメントの各タスクを実行するために必要な権限をユーザーに与える Identity and Access Management(IAM)のロールを付与します。

必要な権限

BigQuery では、ビューはテーブル リソースとして扱われます。このため、ビューを作成するには、テーブルの作成と同じ権限が必要になります。また、ビューの SQL クエリで参照されるテーブルにクエリを実行する権限も必要です。

ビューを作成するには、bigquery.tables.create IAM 権限が必要です。

次の IAM 事前定義ロールには、ビューの作成に必要な権限が含まれています。

  • roles/bigquery.dataEditor
  • roles/bigquery.dataOwner
  • roles/bigquery.admin

bigquery.datasets.create 権限がある場合は、作成したデータセットにビューを作成できます。所有していないデータのビューを作成するには、そのテーブルに対する bigquery.jobs.create 権限が必要です。

BigQuery での IAM のロールと権限については、事前定義ロールと権限をご覧ください。

ビューの命名

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

  • 1,024 文字以内。
  • カテゴリ L(文字)、M(マーク)、N(数字)、Pc(コネクタ、アンダースコアを含む)、Pd(ダッシュ)、Zs(スペース)の Unicode 文字を含む。詳しくは、一般カテゴリをご覧ください。

たとえば、view 01ग्राहक00_お客様étudiant-01 はすべて有効なビュー名です。

一部のビュー名とビュー名の接頭辞は予約されています。ビュー名または接頭辞が予約されているというエラーが表示された場合は、別の名前を選択して、もう一度試してください。

ビューの作成

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

ビューを作成するには:

Console

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

    ビューを保存。

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

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

bq

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

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

デフォルト プロジェクト以外のプロジェクトにビューを作成する場合は、--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 は、ビューで使用される UDF リソースとして読み込まれ、すぐに評価されるコードファイルの URI またはローカル ファイル システムのパスです。複数のファイルを指定するには、フラグを繰り返します。
  • INTEGER は、ビューの存続期間(秒)を設定します。INTEGER0 の場合、ビューに期限切れはありません。--expiration フラグを省略した場合、BigQuery はビューを作成し、データセットのデフォルトのテーブル存続期間を設定します。
  • DESCRIPTION はビューの説明であり、引用符で囲みます。
  • KEY:VALUE は、ラベルを表す Key-Value ペアです。複数のラベルを指定するには、--label フラグを繰り返します。
  • QUERY は有効なクエリです。
  • 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 という名前のビューを作成します。説明は This is my view、ラベルは organization:development に設定されます。ビューの有効期限は、データセットのデフォルトのテーブル有効期限に設定されます。ビューの作成に使用されるクエリは、USA Name データ一般公開データセットのデータを照会します。

bq mk \
--use_legacy_sql=false \
--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
}

Java

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

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableInfo;
import com.google.cloud.bigquery.ViewDefinition;

// Sample to create a view
public class CreateView {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String viewName = "MY_VIEW_NAME";
    String query =
        String.format(
            "SELECT TimestampField, StringField, BooleanField FROM %s.%s", datasetName, tableName);
    createView(datasetName, viewName, query);
  }

  public static void createView(String datasetName, String viewName, String query) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, viewName);

      ViewDefinition viewDefinition =
          ViewDefinition.newBuilder(query).setUseLegacySql(false).build();

      bigquery.create(TableInfo.of(tableId, viewDefinition));
      System.out.println("View created successfully");
    } catch (BigQueryException e) {
      System.out.println("View was not created. \n" + e.toString());
    }
  }
}

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()

view_id = "my-project.my_dataset.my_view"
source_id = "my-project.my_dataset.my_table"
view = bigquery.Table(view_id)

# The source table in this example is created from a CSV file in Google
# Cloud Storage located at
# `gs://cloud-samples-data/bigquery/us-states/us-states.csv`. It contains
# 50 US states, while the view returns only those states with names
# starting with the letter 'W'.
view.view_query = f"SELECT name, post_abbr FROM `{source_id}` WHERE name LIKE 'W%'"

# Make an API request to create the view.
view = client.create_table(view)
print(f"Created {view.table_type}: {str(view.reference)}")

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

ビューのセキュリティ

BigQuery でビューへのアクセスを制御するには、ビューへのアクセスの制御をご覧ください。

次のステップ