ビューを作成する

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

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

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

ビューの制限

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

  • ビューは読み取り専用です。 たとえば、データを挿入、更新、削除するクエリは実行できません。
  • ビューを含むデータセットと、そのビューによって参照されているテーブルを含むデータセットは、同じロケーションに存在する必要があります。
  • ビュー内の参照は、データセットで修飾する必要があります。デフォルトのデータセットはビューの本文に影響しません。
  • TableDataList JSON API メソッドを使用してビューからデータを取得することはできません。詳細については、Tabledata: list をご覧ください。
  • ビューを使用するときは、GoogleSQL クエリとレガシー SQL クエリを併用できません。GoogleSQL クエリは、レガシー SQL 構文を使用して定義したビューを参照できません。
  • ビューでクエリ パラメータを参照することはできません。
  • ビューを作成すると、元のテーブルのスキーマがビューと一緒に保存されます。ビューの作成後に列を追加、削除、または変更しても、ビューは自動的に更新されません。ビューの SQL 定義が変更されるか、ビューが再作成されるまで、報告されるスキーマは不正確なままになります。報告されるスキーマが正確でない場合でも、送信されたクエリは正しい結果を出力します。
  • レガシー SQL ビューを GoogleSQL 構文に自動的に更新することはできません。ビューの定義に使用されるクエリを変更するには、次のものを使用できます。
  • ビューを定義する SQL クエリに一時的なユーザー定義関数と、一時テーブルを含めることはできません。
  • ワイルドカード テーブル クエリでビューを参照することはできません。

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

始める前に

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

必要な権限

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

ビューを作成するには、bigquery.tables.create IAM 権限が必要です。事前定義された IAM ロールの roles/bigquery.dataEditor には、ビューの作成に必要な権限が含まれています。

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

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

ビューの命名

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

  • UTF-8 バイトの文字を合計で 1,024 バイト以下にする。
  • カテゴリ L(文字)、M(マーク)、N(数字)、Pc(コネクタ、アンダースコアを含む)、Pd(ダッシュ)、Zs(スペース)の Unicode 文字を含む。詳しくは、一般カテゴリをご覧ください。

有効なビュー名の例: view 01ग्राहक00_お客様étudiant-01

注意点:

  • テーブル名では、デフォルトで大文字と小文字が区別されます。mytableMyTable は、大文字と小文字を区別しないデータセットでない限り、同じデータセット内に共存できます。
  • 一部のビュー名とビュー名の接頭辞は予約されています。ビュー名または接頭辞が予約されているというエラーが表示された場合は、別の名前を選択して、もう一度試してください。
  • ドット演算子(.)を連続して含めると、重複する演算子が暗黙的に削除されます。

    たとえば、project_name....dataset_name..table_name

    project_name.dataset_name.table_name のようになります。

ビューを作成する

ビューを作成するには、ビューにアクセス可能なデータを定義する SQL クエリを作成します。SQL クエリは、SELECT ステートメントで構成する必要があります。他のステートメント タイプ(DML ステートメントなど)とマルチステートメント クエリはビュークエリでは使用できません。

ビューを作成するには:

Console

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

    ビューを保存。

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

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

SQL

CREATE VIEW ステートメントを使用します。次のステートメントでは、米国の名前の一般公開データセットから usa_male_names という名前のビューを作成します。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE VIEW mydataset.usa_male_names(name, number) AS (
      SELECT
        name,
        number
      FROM
        bigquery-public-data.usa_names.usa_1910_current
      WHERE
        gender = 'M'
      ORDER BY
        number DESC
    );

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

bq

--view フラグを指定して bq mk コマンドを使用します。GoogleSQL クエリの場合は、--use_legacy_sql フラグを追加して false に設定します。オプション パラメータには --add_tags--expiration--description--label などがあります。パラメータの一覧については、bq mk コマンド リファレンスをご覧ください。

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

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

bq mk \
--use_legacy_sql=false \
--view_udf_resource=PATH_TO_FILE \
--expiration=INTEGER \
--description="DESCRIPTION" \
--label=KEY_1:VALUE_1 \
--add_tags=KEY_2:VALUE_2[,...] \
--view='QUERY' \
--project_id=PROJECT_ID \
DATASET.VIEW

次のように置き換えます。

  • PATH_TO_FILE は、ビューで使用される UDF リソースとして読み込まれ、すぐに評価されるコードファイルの URI またはローカル ファイル システムのパスです。複数のファイルを指定するには、フラグを繰り返します。
  • INTEGER は、ビューの存続期間(秒)を設定します。INTEGER0 の場合、ビューに期限切れはありません。--expiration フラグを省略した場合、BigQuery はビューを作成し、データセットのデフォルトのテーブル存続期間を設定します。
  • DESCRIPTION はビューの説明であり、引用符で囲みます。
  • KEY_1:VALUE_1 は、ラベルを表す Key-Value ペアです。複数のラベルを指定するには、--label フラグを繰り返します。
  • KEY_2:VALUE_2 は、タグを表す Key-Value ペアです。同じフラグで、各 Key-Value ペアをカンマで区切って複数のタグを追加できます。
  • 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

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

Terraform

google_bigquery_table リソースを使用します。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

次の例では、myview という名前のビューが作成されます。

resource "google_bigquery_dataset" "default" {
  dataset_id                      = "mydataset"
  default_partition_expiration_ms = 2592000000  # 30 days
  default_table_expiration_ms     = 31536000000 # 365 days
  description                     = "dataset description"
  location                        = "US"
  max_time_travel_hours           = 96 # 4 days

  labels = {
    billing_group = "accounting",
    pii           = "sensitive"
  }
}

resource "google_bigquery_table" "default" {
  dataset_id          = google_bigquery_dataset.default.dataset_id
  table_id            = "myview"
  deletion_protection = false # set to "true" in production

  view {
    query          = "SELECT global_id, faa_identifier, name, latitude, longitude FROM `bigquery-public-data.faa.us_airports`"
    use_legacy_sql = false
  }

}

Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。

Cloud Shell を準備する

  1. Cloud Shell を起動します。
  2. Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。

    このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。

ディレクトリを準備する

Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。

  1. Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は .tf にする必要があります(例: main.tf)。このチュートリアルでは、このファイルを main.tf とします。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。

    新しく作成した main.tf にサンプルコードをコピーします。

    必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。

  3. 環境に適用するサンプル パラメータを確認し、変更します。
  4. 変更を保存します。
  5. Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
    terraform init

    最新バージョンの Google プロバイダを使用する場合は、-upgrade オプションを使用します。

    terraform init -upgrade

変更を適用する

  1. 構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
    terraform plan

    必要に応じて構成を修正します。

  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、Terraform 構成を適用します。
    terraform apply

    Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。

  3. Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。

API

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

Go

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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 のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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 のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

// 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 のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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 でビューへのアクセスを制御するには、承認済みビューをご覧ください。

次のステップ