テーブルを管理する

このドキュメントでは、BigQuery でテーブルを管理する方法について説明します。BigQuery のテーブルの管理タスクには以下のようなものがあります。

テーブル情報の取得、テーブルの一覧表示、テーブルデータへのアクセス制御など、テーブルの作成と使用の詳細については、テーブルの作成と使用をご覧ください。

始める前に

このドキュメントの各タスクを実行するために必要な権限をユーザーに与える Identity and Access Management(IAM)のロールを付与します。タスクの実行に必要な権限(存在する場合)は、タスクの「必要な権限」セクションに記載されています。

テーブルのプロパティを更新する

テーブルの次の要素を更新できます。

必要な権限

テーブルのプロパティの更新に必要な権限を取得するには、テーブルに対するデータ編集者roles/bigquery.dataEditor)IAM ロールを付与するよう管理者に依頼してください。 ロールの付与の詳細については、アクセス権の管理に関する記事をご覧ください。

この事前定義ロールには、テーブルのプロパティの更新に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

テーブルのプロパティを更新するには、次の権限が必要です。

  • bigquery.tables.update
  • bigquery.tables.get

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

また、bigquery.datasets.create 権限がある場合は、作成したデータセットのテーブルのプロパティを更新できます。

テーブルの説明を更新する

テーブルの説明は次の方法で更新できます。

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

テーブルの説明を更新するには:

コンソール

Google Cloud コンソールを使用してテーブルを作成する場合、説明を追加することはできません。説明は、テーブルの作成後に [詳細] ページで追加できます。

  1. [エクスプローラ] パネルで、プロジェクトとデータセットを開いて、テーブルを選択します。

  2. 詳細パネルで、[詳細] をクリックします。

  3. [説明] セクションの鉛筆アイコンをクリックして、説明を編集します。

    説明の編集。

  4. ボックスに説明を入力し、[更新] をクリックして保存します。

SQL

ALTER TABLE SET OPTIONS ステートメントを使用します。次の例は、mytable という名前のテーブルの説明を更新します。

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

    [BigQuery] に移動

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

    ALTER TABLE mydataset.mytable
      SET OPTIONS (
        description = 'Description of mytable');
    

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

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

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. --description フラグを指定して bq update コマンドを発行します。更新するテーブルがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    bq update \
    --description "description" \
    project_id:dataset.table
    

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

    • description: テーブルの説明テキスト
    • project_id: プロジェクト ID
    • dataset: 更新するテーブルを含むデータセットの名前
    • table: 更新するテーブルの名前

    例:

    mydataset データセットの mytable テーブルの説明を「Description of mytable」に変更するには、次のコマンドを入力します。mydataset データセットはデフォルト プロジェクトにあります。

    bq update --description "Description of mytable" mydataset.mytable
    

    mydataset データセットの mytable テーブルの説明を「Description of mytable」に変更するには、次のコマンドを入力します。mydataset データセットは、デフォルト プロジェクトではなく myotherproject プロジェクトにあります。

    bq update \
    --description "Description of mytable" \
    myotherproject:mydataset.mytable
    

API

tables.patch メソッドを呼び出し、テーブル リソースdescription プロパティを使用して、テーブルの説明を更新します。tables.update メソッドはテーブル リソース全体を置き換えるため、tables.patch メソッドの方が適切です。

Go

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

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

import (
	"context"
	"fmt"

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

// updateTableDescription demonstrates how to fetch a table's metadata and updates the Description metadata.
func updateTableDescription(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	tableRef := client.Dataset(datasetID).Table(tableID)
	meta, err := tableRef.Metadata(ctx)
	if err != nil {
		return err
	}
	update := bigquery.TableMetadataToUpdate{
		Description: "Updated description.",
	}
	if _, err = tableRef.Update(ctx, update, meta.ETag); 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.Table;

public class UpdateTableDescription {

  public static void runUpdateTableDescription() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String newDescription = "this is the new table description";
    updateTableDescription(datasetName, tableName, newDescription);
  }

  public static void updateTableDescription(
      String datasetName, String tableName, String newDescription) {
    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();

      Table table = bigquery.getTable(datasetName, tableName);
      bigquery.update(table.toBuilder().setDescription(newDescription).build());
      System.out.println("Table description updated successfully to " + newDescription);
    } catch (BigQueryException e) {
      System.out.println("Table description was not updated \n" + e.toString());
    }
  }
}

Python

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

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

Table.description プロパティを構成し、Client.update_table() を呼び出して API に更新を送信します。
# from google.cloud import bigquery
# client = bigquery.Client()
# project = client.project
# dataset_ref = bigquery.DatasetReference(project, dataset_id)
# table_ref = dataset_ref.table('my_table')
# table = client.get_table(table_ref)  # API request

assert table.description == "Original description."
table.description = "Updated description."

table = client.update_table(table, ["description"])  # API request

assert table.description == "Updated description."

テーブルの有効期限を更新する

データセット レベルでデフォルトのテーブル有効期限を設定できます。また、テーブルの作成時にテーブルの有効期限を設定することもできます。テーブルの有効期限は有効期間(TTL)と呼ばれることもあります。

テーブルが期限切れになると、テーブル内のすべてのデータとともに、テーブルが削除されます。必要な場合は、データセットに指定されたタイムトラベル期間内に期限切れのテーブルの削除を取り消すことができます。詳細については、削除されたテーブルの復元をご覧ください。

テーブルの作成時に有効期限を設定した場合、データセットのデフォルトのテーブル有効期限は無視されます。データセット レベルでデフォルトのテーブル有効期限を設定せず、テーブルの作成時にもテーブル有効期限を設定しなかった場合、テーブルは無期限に有効になります。このようなテーブルは手動で削除する必要があります。

テーブルを作成した後、テーブルの有効期限を次の方法でいつでも更新できます。

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

テーブルの有効期限を更新するには:

コンソール

Google Cloud コンソールを使用してテーブルを作成するときに有効期限を追加することはできません。テーブルを作成した後、[テーブル詳細] ページでテーブルの有効期限を追加または更新できます。

  1. [エクスプローラ] パネルで、プロジェクトとデータセットを開いて、テーブルを選択します。

  2. 詳細パネルで、[詳細] をクリックします。

  3. [テーブル情報] の横にある鉛筆アイコンをクリックします。

  4. [テーブルの有効期限] で [日付を指定] を選択します。次に、カレンダー ウィジェットで有効期限を選択します。

  5. [更新] をクリックして保存します。更新された有効期限が [テーブル情報] セクションに表示されます。

SQL

ALTER TABLE SET OPTIONS ステートメントを使用します。次の例では、mytable という名前のテーブルの有効期限を更新します。

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

    [BigQuery] に移動

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

    ALTER TABLE mydataset.mytable
      SET OPTIONS (
        -- Sets table expiration to timestamp 2025-02-03 12:34:56
        expiration_timestamp = TIMESTAMP '2025-02-03 12:34:56');
    

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

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

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. --expiration フラグを指定して bq update コマンドを発行します。更新するテーブルがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    bq update \
    --expiration integer \
    project_id:dataset.table
    

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

    • integer: テーブルのデフォルトの存続期間(秒)です。最小値は 3,600 秒(1 時間)です。現在時刻にこの整数値を足した値が有効期限になります。0 を指定すると、テーブルの有効期限が削除され、テーブルは無期限に有効になります。有効期限のないテーブルは手動で削除する必要があります。
    • project_id: プロジェクト ID。
    • dataset: 更新するテーブルを含むデータセットの名前。
    • table: 更新するテーブルの名前。

    例:

    mydataset データセットの mytable テーブルの有効期限を 5 日(432,000 秒)に更新するには、次のコマンドを入力します。mydataset データセットはデフォルト プロジェクトにあります。

    bq update --expiration 432000 mydataset.mytable
    

    mydataset データセットの mytable テーブルの有効期限を 5 日(432,000 秒)に更新するには、次のコマンドを入力します。mydataset データセットは、デフォルト プロジェクトではなく myotherproject プロジェクトにあります。

    bq update --expiration 432000 myotherproject:mydataset.mytable
    

API

tables.patch メソッドを呼び出し、テーブル リソースexpirationTime プロパティを使用して、テーブルの有効期限(ミリ秒単位)を更新します。tables.update メソッドはテーブル リソース全体を置き換えるため、tables.patch メソッドの方が適切です。

Go

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

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

import (
	"context"
	"fmt"
	"time"

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

// updateTableExpiration demonstrates setting the table expiration of a table to a specific point in time
// in the future, at which time it will be deleted.
func updateTableExpiration(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	tableRef := client.Dataset(datasetID).Table(tableID)
	meta, err := tableRef.Metadata(ctx)
	if err != nil {
		return err
	}
	update := bigquery.TableMetadataToUpdate{
		ExpirationTime: time.Now().Add(time.Duration(5*24) * time.Hour), // table expiration in 5 days.
	}
	if _, err = tableRef.Update(ctx, update, meta.ETag); 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.Table;
import java.util.concurrent.TimeUnit;

public class UpdateTableExpiration {

  public static void runUpdateTableExpiration() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    // Update table expiration to one day.
    Long newExpiration = TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
    updateTableExpiration(datasetName, tableName, newExpiration);
  }

  public static void updateTableExpiration(
      String datasetName, String tableName, Long newExpiration) {
    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();

      Table table = bigquery.getTable(datasetName, tableName);
      bigquery.update(table.toBuilder().setExpirationTime(newExpiration).build());

      System.out.println("Table expiration updated successfully to " + newExpiration);
    } catch (BigQueryException e) {
      System.out.println("Table expiration was not updated \n" + e.toString());
    }
  }
}

Node.js

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

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

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

async function updateTableExpiration() {
  // Updates a table's expiration.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = 'my_dataset', // Existing dataset
  // const tableId = 'my_table', // Existing table
  // const expirationTime = Date.now() + 1000 * 60 * 60 * 24 * 5 // 5 days from current time in ms

  // Retreive current table metadata
  const table = bigquery.dataset(datasetId).table(tableId);
  const [metadata] = await table.getMetadata();

  // Set new table expiration to 5 days from current time
  metadata.expirationTime = expirationTime.toString();
  const [apiResponse] = await table.setMetadata(metadata);

  const newExpirationTime = apiResponse.expirationTime;
  console.log(`${tableId} expiration: ${newExpirationTime}`);
}

Python

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

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

Table.expires プロパティを構成し、Client.update_table() を呼び出して API に更新を送信します。
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import datetime


def update_table_expiration(table_id, expiration):
    orig_table_id = table_id
    orig_expiration = expiration

    from google.cloud import bigquery

    client = bigquery.Client()

    # TODO(dev): Change table_id to the full name of the table you want to update.
    table_id = "your-project.your_dataset.your_table_name"

    # TODO(dev): Set table to expire for desired days days from now.
    expiration = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(
        days=5
    )

    table_id = orig_table_id
    expiration = orig_expiration

    table = client.get_table(table_id)  # Make an API request.
    table.expires = expiration
    table = client.update_table(table, ["expires"])  # API request

    print(f"Updated {table_id}, expires {table.expires}.")

データセットのデフォルトのパーティション有効期限を更新するには:

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.Dataset;
import java.util.concurrent.TimeUnit;

// Sample to update partition expiration on a dataset.
public class UpdateDatasetPartitionExpiration {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    // Set the default partition expiration (applies to new tables, only) in
    // milliseconds. This example sets the default expiration to 90 days.
    Long newExpiration = TimeUnit.MILLISECONDS.convert(90, TimeUnit.DAYS);
    updateDatasetPartitionExpiration(datasetName, newExpiration);
  }

  public static void updateDatasetPartitionExpiration(String datasetName, Long newExpiration) {
    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();

      Dataset dataset = bigquery.getDataset(datasetName);
      bigquery.update(dataset.toBuilder().setDefaultPartitionExpirationMs(newExpiration).build());
      System.out.println(
          "Dataset default partition expiration updated successfully to " + newExpiration);
    } catch (BigQueryException e) {
      System.out.println("Dataset partition expiration was not updated \n" + e.toString());
    }
  }
}

Python

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

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

# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


def update_dataset_default_partition_expiration(dataset_id: str) -> None:

    from google.cloud import bigquery

    # Construct a BigQuery client object.
    client = bigquery.Client()

    # TODO(developer): Set dataset_id to the ID of the dataset to fetch.
    # dataset_id = 'your-project.your_dataset'

    dataset = client.get_dataset(dataset_id)  # Make an API request.

    # Set the default partition expiration (applies to new tables, only) in
    # milliseconds. This example sets the default expiration to 90 days.
    dataset.default_partition_expiration_ms = 90 * 24 * 60 * 60 * 1000

    dataset = client.update_dataset(
        dataset, ["default_partition_expiration_ms"]
    )  # Make an API request.

    print(
        "Updated dataset {}.{} with new default partition expiration {}".format(
            dataset.project, dataset.dataset_id, dataset.default_partition_expiration_ms
        )
    )

テーブルの丸めモードを更新する

ALTER TABLE SET OPTIONS DDL ステートメントを使用して、テーブルのデフォルトの丸めモードを更新できます。次の例では、mytable のデフォルトの丸めモードを ROUND_HALF_EVEN に更新します。

ALTER TABLE mydataset.mytable
SET OPTIONS (
  default_rounding_mode = "ROUND_HALF_EVEN");

NUMERIC または BIGNUMERIC フィールドをテーブルに追加し、丸めモードを指定しないと、丸めモードは自動的にテーブルのデフォルトの丸めに設定されます。テーブルのデフォルトの丸めモードを変更しても、既存のフィールドの丸めモードは変更されません。

テーブルのスキーマ定義を更新する

テーブルのスキーマ定義の更新方法については、テーブル スキーマの変更をご覧ください。

テーブルの名前を変更する

テーブルを作成した後にテーブルの名前を変更するには、ALTER TABLE RENAME TO ステートメントを使用します。次の例では、mytable の名前を mynewtable に変更します。

ALTER TABLE mydataset.mytable
RENAME TO mynewtable;

テーブル名の変更に関する制限

  • データ ストリーミングを含むテーブルの名前を変更する場合は、ストリーミングを停止して、BigQuery がストリーミングを使用していないことを示すまで待つ必要があります。
  • 通常、テーブルの名前は最後のストリーミング オペレーションから 72 時間以内に変更されますが、それ以上かかる場合もあります。
  • 既存のテーブル ACL と行アクセス ポリシーは保持されますが、テーブル名の変更中に行われたテーブル ACL と行アクセス ポリシーの更新は保持されません。
  • テーブルの名前を変更して、そのテーブルで DML ステートメントを同時に実行することはできません。
  • テーブルの名前を変更すると、テーブルのすべての Data Catalog タグが削除されます。
  • 外部テーブルの名前は変更できません。

テーブルをコピーする

このセクションでは、テーブルの完全なコピーを作成する方法について説明します。他のタイプのテーブルのコピーについては、テーブル クローンテーブル スナップショットをご覧ください。

次の方法でテーブルをコピーできます。

  • Google Cloud コンソールを使用する。
  • bq cp コマンドを使用する。
  • CREATE TABLE COPY データ定義言語(DDL)ステートメントを送信する。
  • jobs.insert API メソッドを呼び出して、copy ジョブを構成する。
  • クライアント ライブラリを使用する。

テーブルのコピーに関する制限事項

テーブルのコピージョブには以下の制限があります。

  • テーブルをコピーするとき、コピー先テーブルの名前は、テーブルの作成時と同じ命名規則に従う必要があります。
  • テーブルのコピーは、コピージョブに関する BigQuery の上限が適用されます。
  • Google Cloud コンソールでは、一度に 1 つのテーブルのみをコピーできます。コピー先データセット内の既存のテーブルを上書きすることはできません。コピーするテーブルには、コピー先データセット内で一意の名前を付ける必要があります。
  • Google Cloud コンソールでは、複数のテーブルを 1 つのテーブルにコピーすることはできません。
  • API、bq コマンドライン ツール、またはクライアント ライブラリで複数のテーブルを 1 つのテーブルにコピーする場合は、すべてのコピー元テーブルで同一のスキーマ(パーティショニングやクラスタリングなど)が使用されている必要があります。

    列の削除や名前変更など、特定のテーブル スキーマの更新を行うと、テーブルのスキーマは同じに見えても、内部表現が変わっていることがあります。これにより、テーブルのコピージョブがエラー Maximum limit on diverging physical schemas reached で失敗する可能性があります。この場合、CREATE TABLE LIKE ステートメントを使用すると、ソーステーブルのスキーマを宛先テーブルのスキーマと完全に一致させることができます。

  • BigQuery では、基盤となるストレージが動的に管理されるため、テーブルのコピーにかかる時間が大きく異なる場合があります。

  • コピー元のテーブルよりも列数が多く、追加された列がデフォルト値を持つコピー先テーブルに、コピー元テーブルをコピーして追加することはできません。代わりに、INSERT destination_table SELECT * FROM source_table を実行してデータをコピーできます。

  • コピー オペレーションが既存のテーブルを上書きする場合は、既存のテーブルに対するテーブルレベルのアクセスが維持されます。ソーステーブルのタグは、上書きされるテーブルにコピーされません。

  • コピー オペレーションによって新しいテーブルが作成される場合、新しいテーブルに対するテーブルレベルのアクセス権は、新しいテーブルが作成されるデータセットのアクセス ポリシーによって決まります。さらに、ソーステーブルから新しいテーブルにタグがコピーされます。

  • 複数のコピー元テーブルを 1 つのコピー先テーブルにコピーする場合は、すべてのコピー元テーブルに同じタグを設定する必要があります。

必要なロール

このドキュメントのタスクを実行するには、次の権限が必要です。

テーブルとパーティションをコピーするロール

テーブルとパーティションのコピーに必要な権限を取得するには、コピー元データセットとコピー先データセットに対するデータ編集者roles/bigquery.dataEditor)IAM ロールを付与するよう管理者に依頼してください。ロールの付与の詳細については、アクセス権の管理に関する記事をご覧ください。

この事前定義ロールには、テーブルとパーティションのコピーに必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

テーブルとパーティションをコピーするには、次の権限が必要です。

  • ソース データセットとコピー先データセットに対する bigquery.tables.getData
  • ソース データセットとコピー先データセットに対する bigquery.tables.get
  • コピー先データセットに対する bigquery.tables.create
  • コピー先データセットに対する bigquery.tables.update

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

コピージョブを実行する権限

コピージョブを実行するために必要な権限を取得するには、コピー元データセットとコピー先データセットに対してジョブユーザーroles/bigquery.jobUser)IAM ロールを付与するよう管理者に依頼してください。ロールの付与の詳細については、アクセス権の管理に関する記事をご覧ください。

この事前定義ロールには、コピージョブを実行するために必要な bigquery.jobs.create 権限が含まれています。

カスタムロールや他の事前定義ロールを使用して、この権限を取得することもできます。

単一ソースのテーブルをコピーする

次の方法で 1 つのテーブルをコピーできます。

  • Google Cloud コンソールを使用する。
  • bq コマンドライン ツールの bq cp コマンドを使用する。
  • CREATE TABLE COPY データ定義言語(DDL)ステートメントを使用する。
  • jobs.insert API メソッドを呼び出して、copy ジョブを構成し、sourceTable プロパティを指定する。
  • クライアント ライブラリを使用する。

Google Cloud コンソールと CREATE TABLE COPY ステートメントを使用する場合、コピージョブでサポートされるのは、コピー元テーブルとコピー先テーブル、それぞれ 1 つのみです。複数のファイルを 1 つのテーブルにコピーするには、bq コマンドライン ツールまたは API を使用する必要があります。

1 つのテーブルをコピーするには:

Console

  1. [エクスプローラ] パネルで、プロジェクトとデータセットを開いて、テーブルを選択します。

  2. 詳細パネルで [テーブルをコピー] をクリックします。

  3. [テーブルのコピー] ダイアログの [コピー先] で次の操作を行います。

    • [プロジェクト名] で、コピーしたテーブルを保存するプロジェクトを選択します。
    • [データセット名] で、コピーしたテーブルを保存するデータセットを選択します。コピー元データセットとコピー先データセットは同じロケーションに存在する必要があります。
    • [テーブル名] に新しいテーブルの名前を入力します。この名前はコピー先データセット内で一意である必要があります。Google Cloud コンソールを使用して、コピー先データセット内の既存のテーブルを上書きすることはできません。テーブル名の要件の詳細については、テーブルの命名をご覧ください。
  4. [コピー] をクリックして、コピージョブを開始します。

SQL

CREATE TABLE COPY ステートメントを使用して、table1 という名前のテーブルを table1copy という名前の新しいテーブルにコピーします。

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

    [BigQuery] に移動

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

    CREATE TABLE myproject.mydataset.table1copy
    COPY myproject.mydataset.table1;
    

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

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

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. bq cp コマンドを発行します。オプションのフラグを使用して、コピー先テーブルの書き込み処理を制御できます。

    • -a または --append_table を指定すると、コピー元テーブルのデータがコピー先データセット内の既存のテーブルの末尾に追加されます。
    • -f または --force を指定すると、コピー先データセット内の既存のテーブルが上書きされます。確認を求めるプロンプトは表示されません。
    • -n または --no_clobber を指定すると、コピー先データセット内にテーブルが存在している場合に Table 'project_id:dataset.table' already exists, skipping. というエラー メッセージが返されます。-n を指定しなかった場合、デフォルトでは、コピー先テーブルを置き換えるかどうかを選択するプロンプトが表示されます。
    • --destination_kms_key には、顧客管理の Cloud KMS 鍵を指定します。これは、コピー先テーブルを暗号化する場合に使用します。

    --destination_kms_key はここでは説明しません。詳細については、Cloud Key Management Service 鍵によるデータの保護をご覧ください。

    コピー元またはコピー先のデータセットがデフォルト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    (省略可)--location フラグを指定して、その値をロケーションに設定します。

    bq --location=location cp \
    -a -f -n \
    project_id:dataset.source_table \
    project_id:dataset.destination_table
    

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

    • location: ロケーションの名前。--location フラグは省略可能です。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値を asia-northeast1 に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。
    • project_id: プロジェクト ID。
    • dataset: コピー元データセットまたはコピー先データセットの名前。
    • source_table: コピーするテーブル。
    • destination_table: 宛先データセット内のテーブル名。

    例:

    mydataset.mytable テーブルを mydataset2.mytable2 テーブルにコピーするには、次のコマンドを入力します。データセットは両方ともデフォルト プロジェクトにあります。

    bq cp mydataset.mytable mydataset2.mytable2
    

    mydataset.mytable テーブルをコピーして、同じ名前が付いたコピー先のテーブルを上書きするには、次のコマンドを入力します。コピー元データセットはデフォルト プロジェクトにあります。コピー先データセットは、myotherproject プロジェクトにあります。-f ショートカットが指定されているため、コピー先テーブルは確認プロンプトなしで上書きされます。

    bq cp -f \
    mydataset.mytable \
    myotherproject:myotherdataset.mytable
    

    mydataset.mytable テーブルのコピーで、コピー先データセットに同じ名前のテーブルがある場合にエラーを返すには、次のコマンドを入力します。コ