テーブルの管理

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

  • 以下のテーブル情報を更新する
    • 有効期限
    • 説明
    • スキーマ定義
    • ラベル
  • テーブルの名前を変更する(テーブルをコピーする)
  • テーブルをコピーする
  • テーブルを削除する
  • 削除されたテーブルを復元する

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

テーブル プロパティの更新

テーブルの以下の情報を更新できます。

必要な権限

テーブルを更新するには、少なくとも bigquery.tables.update 権限と bigquery.tables.get 権限が付与されている必要があります。次の事前定義済みの IAM ロールには bigquery.tables.update 権限と bigquery.tables.get 権限が含まれています。

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

また、bigquery.datasets.create 権限を持つユーザーがデータセットを作成すると、そのデータセットに対する bigquery.dataOwner アクセス権がユーザーに付与されます。bigquery.dataOwner アクセス権により、ユーザーは作成したデータセットのテーブル プロパティを更新できます。

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

テーブルの説明の更新

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

  • Cloud Console または従来の BigQuery ウェブ UI を使用する
  • DDL ALTER TABLE ステートメントを使用する
  • bq コマンドライン ツールの bq update コマンドを使用する
  • tables.patch API メソッドを呼び出す
  • クライアント ライブラリを使用する

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

Console

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

  1. [リソース] ペインでテーブルを選択します。

  2. [クエリエディタ] で [詳細] をクリックします。

    テーブル スキーマの編集。

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

    説明の編集。

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

SQL

データ定義言語(DDL)ステートメントを使用すると、標準 SQL クエリ構文を使用してテーブルとビューの作成と変更ができます。

データ定義言語ステートメントの使用をご覧ください。

Cloud Console で DDL ステートメントを使用してテーブルの説明を更新するには:

  1. [クエリを新規作成] をクリックします。

  2. [クエリエディタ] テキスト領域に DDL ステートメントを入力します。

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

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

従来の UI

  1. ナビゲーション パネルで、テーブルを選択します。

  2. [Table Details] ページで、[Details] をクリックします。

  3. [Description] セクションで、[Describe this table] をクリックして説明ボックスを開きます。

  4. ボックスに説明を入力します。ボックスの外側をクリックすると、テキストが保存されます。

    テーブルの説明。

bq

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

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

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

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(Time To Live)と呼ばれます。

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

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

  • Cloud Console または従来の BigQuery ウェブ UI を使用する
  • DDL ALTER TABLE ステートメントを使用する
  • bq コマンドライン ツールの bq update コマンドを使用する
  • tables.patch API メソッドを呼び出す
  • クライアント ライブラリを使用する

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

Console

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

  1. [リソース] ペインでテーブルを選択します。

  2. [クエリエディタ] で [詳細] をクリックします。

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

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

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

SQL

データ定義言語(DDL)ステートメントを使用すると、標準 SQL クエリ構文を使用してテーブルとビューの作成と変更ができます。

データ定義言語ステートメントの使用をご覧ください。

Cloud Console で DDL ステートメントを使用して有効期限を更新するには:

  1. [クエリを新規作成] をクリックします。

  2. [クエリエディタ] テキスト領域に DDL ステートメントを入力します。

     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. [実行] をクリックします。

従来の UI

  1. ナビゲーション パネルで、テーブルを選択します。

  2. [Table Details] ページで、[Details] をクリックします。

  3. [Expiration Time] の [Edit] をクリックします。

  4. [Update Expiration] ダイアログで、[In] をクリックし、有効期限を日数として入力します。

  5. [OK] をクリックします。更新された有効期限が [Details] ページに表示されます。

    テーブルの有効期限。

bq

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

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

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

Python

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

Table.expires プロパティを構成し、Client.update_table() を呼び出して API に更新を送信します。

import datetime
import pytz

# 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.expires is None

# set table to expire 5 days from now
expiration = datetime.datetime.now(pytz.utc) + datetime.timedelta(days=5)
table.expires = expiration
table = client.update_table(table, ["expires"])  # API request

# expiration is stored in milliseconds
margin = datetime.timedelta(microseconds=1000)
assert expiration - margin <= table.expires <= expiration + margin

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

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

テーブル名の変更

現在のところ、既存のテーブルの名前を変更することはできません。テーブル名を変更する場合は、テーブルをコピーする手順に従います。コピー オペレーションでコピー先テーブルを指定する際に新しいテーブル名を使用します。

テーブルのコピー

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

  • Cloud Console または従来の BigQuery ウェブ UI を使用する
  • bq コマンドライン ツールの bq cp コマンドを使用する
  • jobs.insert API メソッドを呼び出して copy ジョブを構成する
  • クライアント ライブラリを使用する

必要な権限

テーブルとパーティションをコピーするユーザーには、少なくとも以下の権限が付与されている必要があります。

コピー元データセットに対して:

  • bigquery.tables.get
  • bigquery.tables.getData

コピー先データセットに対して:

  • bigquery.tables.create でコピー先データセット内のテーブルまたはパーティションのコピーを作成する

bigquery.tables.create 権限、bigquery.tables.get 権限、bigquery.tables.getData 権限は、事前定義された以下の IAM のロールに含まれています。

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

また、コピージョブを実行するには、bigquery.jobs.create 権限が付与されている必要があります。

次の事前定義された IAM ロールには bigquery.jobs.create 権限が含まれています。

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

また、bigquery.datasets.create 権限を持つユーザーがデータセットを作成すると、そのデータセットに対する bigquery.dataOwner アクセス権がユーザーに付与されます。bigquery.dataOwner アクセス権により、ユーザーはデータセット内のテーブルとパーティションをコピーできますが、コピー先データセットについては、同じユーザーが作成した場合を除き、アクセス権を明示的に指定する必要があります。

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

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

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

  • テーブルをコピーするとき、コピー先テーブルの名前は、テーブルの作成時と同じ命名規則に従う必要があります。
  • テーブルのコピーは、コピージョブに関する BigQuery の割り当てポリシーの対象です。
  • Cloud Console や従来の BigQuery ウェブ UI を使用してテーブルをコピーする場合、コピー先データセット内の既存のテーブルを上書きすることはできません。コピーするテーブルには、コピー先データセット内で一意の名前を付ける必要があります。
  • テーブルをコピーするとき、コピー先データセットは、コピー先テーブルを含むデータセットと同じロケーションに存在する必要があります。たとえば、EU にあるデータセットからテーブルをコピーして US にあるデータセットに書き込むことはできません。
  • Cloud Console または従来の BigQuery ウェブ UI では、複数のテーブルを 1 つのテーブルにコピーできません。
  • API または bq コマンドライン ツールで複数のテーブルを 1 つのテーブルにコピーする場合は、すべてのコピー元テーブルで同一のスキーマが使用されている必要があります。

1 つのテーブルのコピー

コピー元テーブルが 1 つの場合は、次の方法でコピーできます。

  • Cloud Console または従来の BigQuery ウェブ UI を使用する
  • bq コマンドライン ツールの bq cp コマンドを使用する
  • jobs.insert API メソッドを呼び出して、copy ジョブを構成し、sourceTable プロパティを指定する
  • クライアント ライブラリを使用する

Cloud Console および従来の BigQuery ウェブ UI を使用する場合、コピージョブでサポートされるのは、コピー元テーブルとコピー先テーブル、それぞれ 1 つのみです。複数のファイルを 1 つのテーブルにコピーするには、bq コマンドライン ツールまたは API を使用する必要があります。

1 つのテーブルをコピーする手順は以下のとおりです。

Console

  1. [リソース] ペインで、コピーするテーブルを選択します。

  2. [クエリエディタ] の下にある [テーブルをコピー] をクリックします。

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

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

従来の UI

  1. コピーするテーブルの横にある 下矢印 メニュー表示アイコンをクリックし、[Copy Table] をクリックします。

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

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

      テーブルのコピー。

  3. [OK] をクリックしてコピージョブを開始します。

bq

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.mytablemydataset2.mytable2 にコピーするには、次のコマンドを入力します。データセットは両方ともデフォルト プロジェクトにあります。

bq cp mydataset.mytable mydataset2.mytable2

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

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

mydataset.mytable をコピーして、コピー先データセットに同じ名前のテーブルがある場合にエラーを返すには、次のコマンドを入力します。コピー元データセットはデフォルト プロジェクトにあります。コピー先データセットは myotherproject にあります。-n ショートカットが指定されているため、同じ名前のテーブルが上書きされることはありません。

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

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

bq cp -a mydataset.mytable myotherproject:myotherdataset.mytable

API

API を使用して既存のテーブルをコピーするには、bigquery.jobs.insert メソッドを呼び出し、copy ジョブを構成します。ジョブリソースjobReference セクションにある location プロパティでロケーションを指定します。

ジョブ構成で次の値を指定する必要があります。

"copy": {
      "sourceTable": {       // Required
        "projectId": string, // Required
        "datasetId": string, // Required
        "tableId": string    // Required
      },
      "destinationTable": {  // Required
        "projectId": string, // Required
        "datasetId": string, // Required
        "tableId": string    // Required
      },
      "createDisposition": string,  // Optional
      "writeDisposition": string,   // Optional
    },

sourceTable にはコピーするテーブルの情報、destinationTable には新しいテーブルの情報を指定します。createDisposition には同名のテーブルが存在しない場合に新しく作成するかどうか、writeDisposition には既存のテーブルを上書きするかデータを追加するかを指定します。

C#

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


using Google.Apis.Bigquery.v2.Data;
using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryCopyTable
{
    public void CopyTable(
        string projectId = "your-project-id",
        string destinationDatasetId = "your_dataset_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        TableReference sourceTableRef = new TableReference()
        {
            TableId = "shakespeare",
            DatasetId = "samples",
            ProjectId = "bigquery-public-data"
        };
        TableReference destinationTableRef = client.GetTableReference(
            destinationDatasetId, "destination_table");
        BigQueryJob job = client.CreateCopyJob(
            sourceTableRef, destinationTableRef)
            .PollUntilCompleted();  // Wait for the job to complete.
        // Retrieve destination table
        BigQueryTable destinationTable = client.GetTable(destinationTableRef);
        Console.WriteLine(
            $"Copied {destinationTable.Resource.NumRows} rows from table "
            + $"{sourceTableRef.DatasetId}.{sourceTableRef.TableId} "
            + $"to {destinationTable.FullyQualifiedId}."
        );
    }
}

Go

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

import (
	"context"
	"fmt"

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

// copyTable demonstrates copying a table from a source to a destination, and
// allowing the copy to overwrite existing data by using truncation.
func copyTable(projectID, datasetID, srcID, dstID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// srcID := "sourcetable"
	// dstID := "destinationtable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	dataset := client.Dataset(datasetID)
	copier := dataset.Table(dstID).CopierFrom(dataset.Table(srcID))
	copier.WriteDisposition = bigquery.WriteTruncate
	job, err := copier.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); 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.CopyJobConfiguration;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.TableId;

public class CopyTable {

  public static void runCopyTable() {
    // TODO(developer): Replace these variables before running the sample.
    String destinationDatasetName = "MY_DESTINATION_DATASET_NAME";
    String destinationTableId = "MY_DESTINATION_TABLE_NAME";
    String sourceDatasetName = "MY_SOURCE_DATASET_NAME";
    String sourceTableId = "MY_SOURCE_TABLE_NAME";

    copyTable(sourceDatasetName, sourceTableId, destinationDatasetName, destinationTableId);
  }

  public static void copyTable(
      String sourceDatasetName,
      String sourceTableId,
      String destinationDatasetName,
      String destinationTableId) {
    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 sourceTable = TableId.of(sourceDatasetName, sourceTableId);
      TableId destinationTable = TableId.of(destinationDatasetName, destinationTableId);

      // For more information on CopyJobConfiguration see:
      // https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobConfiguration.html
      CopyJobConfiguration configuration =
          CopyJobConfiguration.newBuilder(destinationTable, sourceTable).build();

      // For more information on Job see:
      // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html
      Job job = bigquery.create(JobInfo.of(configuration));

      // Blocks until this job completes its execution, either failing or succeeding.
      Job completedJob = job.waitFor();
      if (completedJob == null) {
        System.out.println("Job not executed since it no longer exists.");
        return;
      } else if (completedJob.getStatus().getError() != null) {
        System.out.println(
            "BigQuery was unable to copy table due to an error: \n" + job.getStatus().getError());
        return;
      }
      System.out.println("Table copied successfully.");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Table copying job was interrupted. \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 copyTable() {
  // Copies src_dataset:src_table to dest_dataset:dest_table.

  /**
   * TODO(developer): Uncomment the following lines before running the sample
   */
  // const srcDatasetId = "my_src_dataset";
  // const srcTableId = "my_src_table";
  // const destDatasetId = "my_dest_dataset";
  // const destTableId = "my_dest_table";

  // Copy the table contents into another table
  const [job] = await bigquery
    .dataset(srcDatasetId)
    .table(srcTableId)
    .copy(bigquery.dataset(destDatasetId).table(destTableId));

  console.log(`Job ${job.id} completed.`);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}

PHP

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

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $sourceTableId   = 'The BigQuery table ID to copy from';
// $destinationTableId = 'The BigQuery table ID to copy to';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$sourceTable = $dataset->table($sourceTableId);
$destinationTable = $dataset->table($destinationTableId);
$copyConfig = $sourceTable->copy($destinationTable);
$job = $sourceTable->runJob($copyConfig);

// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});
// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
    $error = $job->info()['status']['errorResult']['message'];
    printf('Error running job: %s' . PHP_EOL, $error);
} else {
    print('Table copied successfully' . PHP_EOL);
}

Python

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


from google.cloud import bigquery

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

# TODO(developer): Set source_table_id to the ID of the original table.
# source_table_id = "your-project.source_dataset.source_table"

# TODO(developer): Set destination_table_id to the ID of the destination table.
# destination_table_id = "your-project.destination_dataset.destination_table"

job = client.copy_table(source_table_id, destination_table_id)
job.result()  # Wait for the job to complete.

print("A copy of the table created.")

複数のテーブルのコピー

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

  • bq コマンドライン ツールの bq cp コマンドを使用する
  • jobs.insert メソッドを呼び出して、copy ジョブを構成し、sourceTables プロパティを指定する
  • クライアント ライブラリを使用する

すべてのコピー元テーブルのスキーマが同一である必要があります。指定できるコピー先テーブルは 1 つだけです。

コピー元テーブルは、カンマ区切りのリストとして指定する必要があります。複数のテーブルをコピーする場合は、ワイルドカードを使用できません。

複数のテーブルをコピーするには:

Console

現在のところ、Cloud Console では、複数のテーブルのコピーはサポートされていません。

従来の UI

現在のところ、従来の BigQuery ウェブ UI では、複数のテーブルのコピーはサポートされていません。

bq

bq cp コマンドを発行し、複数のコピー元テーブルをカンマ区切りのリストとして指定します。オプションのフラグを使用して、コピー先テーブルの書き込み処理を制御できます。

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

ここでは --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.source_table \
project_id:dataset.destination_table

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

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

例:

mydataset.mytablemydataset.mytable2mydataset2.tablecopy にコピーするには、次のコマンドを入力します。データセットはすべてデフォルト プロジェクトにあります。

bq cp \
mydataset.mytable,mydataset.mytable2 \
mydataset2.tablecopy

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

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

myproject:mydataset.mytablemyproject:mydataset.mytable2 をコピーして、コピー先データセットに同じ名前のテーブルがある場合にエラーを返すには、次のコマンドを入力します。コピー先データセットは myotherproject にあります。-n ショートカットが指定されているため、同じ名前のテーブルが上書きされることはありません。

bq cp -n \
myproject:mydataset.mytable,myproject:mydataset.mytable2 \
myotherproject:myotherdataset.mytable

mydataset.mytablemydataset.mytable2 をコピーして、コピー先にある同じ名前のテーブルに追加するには、次のコマンドを入力します。コピー元データセットはデフォルト プロジェクトにあります。コピー先データセットは myotherproject にあります。-a ショートカットが指定されているため、コピー先テーブルの末尾にデータが追加されます。

bq cp -a \
mydataset.mytable,mydataset.mytable2 \
myotherproject:myotherdataset.mytable

API

API を使用して複数のテーブルをコピーするには、jobs.insert メソッドを呼び出して copy ジョブを構成し、sourceTables プロパティを指定します。

ジョブリソースjobReference セクションにある location プロパティでリージョンを指定します。

Go

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

import (
	"context"
	"fmt"

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

// copyMultiTable demonstrates using a copy job to copy multiple source tables into a single destination table.
func copyMultiTable(projectID, srcDatasetID string, srcTableIDs []string, dstDatasetID, dstTableID string) error {
	// projectID := "my-project-id"
	// srcDatasetID := "sourcedataset"
	// srcTableIDs := []string{"table1","table2"}
	// dstDatasetID = "destinationdataset"
	// dstTableID = "destinationtable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	srcDataset := client.Dataset(srcDatasetID)
	dstDataset := client.Dataset(dstDatasetID)
	var tableRefs []*bigquery.Table
	for _, v := range srcTableIDs {
		tableRefs = append(tableRefs, srcDataset.Table(v))
	}
	copier := dstDataset.Table(dstTableID).CopierFrom(tableRefs...)
	copier.WriteDisposition = bigquery.WriteTruncate
	job, err := copier.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); 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.CopyJobConfiguration;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.TableId;
import java.util.Arrays;

public class CopyMultipleTables {

  public static void runCopyMultipleTables() {
    // TODO(developer): Replace these variables before running the sample.
    String destinationDatasetName = "MY_DATASET_NAME";
    String destinationTableId = "MY_TABLE_NAME";
    copyMultipleTables(destinationDatasetName, destinationTableId);
  }

  public static void copyMultipleTables(String destinationDatasetName, String destinationTableId) {
    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 destinationTable = TableId.of(destinationDatasetName, destinationTableId);

      // For more information on CopyJobConfiguration see:
      // https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobConfiguration.html
      CopyJobConfiguration configuration =
          CopyJobConfiguration.newBuilder(
                  destinationTable,
                  Arrays.asList(
                      TableId.of(destinationDatasetName, "table1"),
                      TableId.of(destinationDatasetName, "table2")))
              .build();

      // For more information on Job see:
      // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html
      Job job = bigquery.create(JobInfo.of(configuration));

      // Blocks until this job completes its execution, either failing or succeeding.
      Job completedJob = job.waitFor();
      if (completedJob == null) {
        System.out.println("Job not executed since it no longer exists.");
        return;
      } else if (completedJob.getStatus().getError() != null) {
        System.out.println(
            "BigQuery was unable to copy tables due to an error: \n" + job.getStatus().getError());
        return;
      }
      System.out.println("Table copied successfully.");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Table copying job was interrupted. \n" + e.toString());
    }
  }
}

Node.js

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

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

async function copyTableMultipleSource() {
  // Copy multiple source tables to a given destination.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // sourceTable = 'my_table';
  // destinationTable = 'testing';

  // Create a client
  const dataset = bigquery.dataset(datasetId);

  const metadata = {
    createDisposition: 'CREATE_NEVER',
    writeDisposition: 'WRITE_TRUNCATE',
  };

  // Create table references
  const table = dataset.table(sourceTable);
  const yourTable = dataset.table(destinationTable);

  // Copy table
  const [apiResponse] = await table.copy(yourTable, metadata);
  console.log(apiResponse.configuration.copy);
}

Python

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


from google.cloud import bigquery

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

# TODO(developer): Set dest_table_id to the ID of the destination table.
# dest_table_id = "your-project.your_dataset.your_table_name"

# TODO(developer): Set table_ids to the list of the IDs of the original tables.
# table_ids = ["your-project.your_dataset.your_table_name", ...]

job = client.copy_table(table_ids, dest_table_id)  # Make an API request.
job.result()  # Wait for the job to complete.

print("The tables {} have been appended to {}".format(table_ids, dest_table_id))

テーブルの削除

テーブルは次の方法で削除できます。

  • Cloud Console または従来の BigQuery ウェブ UI を使用する
  • bq コマンドライン ツールの bq rm コマンドを使用する
  • tables.delete API メソッドを呼び出す
  • クライアント ライブラリを使用する

現在のところ、一度に削除できるテーブルは 1 つのみです。

テーブルを削除すると、そのテーブルに含まれるデータも削除されます。指定した期間の経過後にテーブルを自動的に削除するには、データセットのデフォルトのテーブル有効期限を設定するか、テーブルの作成時に有効期限を設定します。

必要な権限

テーブルを削除するには、少なくとも bigquery.tables.delete 権限と bigquery.tables.get 権限が付与されている必要があります。次の事前定義済みの IAM ロールには bigquery.tables.delete 権限と bigquery.tables.get 権限が含まれています。

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

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

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

テーブルの削除

テーブルを削除するには:

Console

  1. [リソース] ペインでテーブルを選択します。[クエリエディタ] の下にある [テーブルを削除] をクリックします。

  2. ダイアログにテーブルの名前を入力し、[削除] をクリックして確定します。

従来の UI

  1. ナビゲーション バーのテーブル名の横にある下矢印アイコン 下矢印アイコン。 をクリックし、[Delete table] をクリックします。

  2. 確認画面が表示されたら、[OK] をクリックします。

bq

bq rm コマンドに --table フラグ(または -t ショートカット)を指定して実行して、テーブルを削除します。bq コマンドライン ツールを使用してテーブルを削除する場合、操作の確認を求められます。--force フラグ(または -f ショートカット)を使用すると、確認をスキップできます。

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

bq rm \
-f \
-t \
project_id:dataset.table

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

  • project_id: プロジェクト ID
  • dataset: テーブルを含むデータセットの名前
  • table: 削除するテーブルの名前

例:

mytablemydataset から削除するには、次のコマンドを入力します。mydataset はデフォルト プロジェクトにあります。

bq rm -t mydataset.mytable

mytablemydataset から削除するには、次のコマンドを入力します。mydataset はデフォルト プロジェクトではなく myotherproject にあります。

bq rm -t myotherproject:mydataset.mytable

mytablemydataset から削除するには、次のコマンドを入力します。mydataset はデフォルト プロジェクトにあります。このコマンドでは -f ショートカットを使用しているため、確認は省略されます。

bq rm -f -t mydataset.mytable

API

tables.delete API メソッドを呼び出して、tableId パラメータを使用して削除するテーブルを指定します。

C#

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


using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryDeleteTable
{
    public void DeleteTable(
        string projectId = "your-project-id",
        string datasetId = "your_dataset_id",
        string tableId = "your_table_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        client.DeleteTable(datasetId, tableId);
        Console.WriteLine($"Table {tableId} deleted.");
    }
}

Go

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

import (
	"context"
	"fmt"

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

// deleteTable demonstrates deletion of a BigQuery table.
func deleteTable(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()

	table := client.Dataset(datasetID).Table(tableID)
	if err := table.Delete(ctx); 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;

public class DeleteTable {

  public static void runDeleteTable() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    deleteTable(datasetName, tableName);
  }

  public static void deleteTable(String datasetName, String tableName) {
    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();
      boolean success = bigquery.delete(TableId.of(datasetName, tableName));
      if (success) {
        System.out.println("Table deleted successfully");
      } else {
        System.out.println("Table was not found");
      }
    } catch (BigQueryException e) {
      System.out.println("Table was not deleted. \n" + e.toString());
    }
  }
}

Node.js

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

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

async function deleteTable() {
  // Deletes "my_table" from "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // const tableId = "my_table";

  // Delete the table
  await bigquery
    .dataset(datasetId)
    .table(tableId)
    .delete();

  console.log(`Table ${tableId} deleted.`);
}

PHP

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

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $tableId = 'The BigQuery table ID';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$table = $dataset->table($tableId);
$table->delete();
printf('Deleted table %s.%s' . PHP_EOL, $datasetId, $tableId);

Python

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


from google.cloud import bigquery

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

# TODO(developer): Set table_id to the ID of the table to fetch.
# table_id = 'your-project.your_dataset.your_table'

# If the table does not exist, delete_table raises
# google.api_core.exceptions.NotFound unless not_found_ok is True.
client.delete_table(table_id, not_found_ok=True)  # Make an API request.
print("Deleted table '{}'.".format(table_id))

Ruby

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

require "google/cloud/bigquery"

def delete_table dataset_id = "my_dataset_id", table_id = "my_table_id"
  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id
  table    = dataset.table table_id

  table.delete

  puts "Table #{table_id} deleted."
end

削除したテーブルの復元

削除してから 7 日以内であれば、テーブルの削除を取り消すことができます。明示的な削除だけでなく、テーブルの有効期限による暗黙的な削除も取り消しが可能です。FOR SYSTEM_TIME AS OF 機能を使用すると、削除イベントの前にテーブルを参照してコピーできます。

7 日が経過した後は、いずれの方法でもテーブルの削除を取り消すことができません。FOR SYSTEM_TIME AS OF などの他の方法(サポート チケットなど)も使用できません。

削除したテーブルの復元

削除したテーブルは次の方法で復元できます。

  • bq コマンドライン ツールで @<time> スナップショット デコレータを使用する
  • クライアント ライブラリを使用する

Console

Cloud Console を使用してテーブルの削除を取り消すことはできません。

従来の UI

従来のウェブ UI を使用してテーブルの削除を取り消すことはできません。

bq

テーブルの削除を取り消すには、@<time> スナップショット デコレータを使用してテーブルコピー オペレーションを使用します。まず、テーブルが存在していたときの UNIX タイムスタンプ(ミリ秒単位)を特定します。次に、そのタイムスタンプの時点のテーブルを新しいテーブルにコピーします。新しいテーブルの名前は、削除したテーブルとは異なる名前にする必要があります。

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

たとえば、1418864998000 の時点の mydataset.mytable を新しいテーブル mydataset.newtable にコピーするには、次のコマンドを入力します。

bq cp mydataset.mytable@1418864998000 mydataset.newtable

詳細については、レガシー SQL でのテーブル デコレータをご覧ください。

Go

import (
	"context"
	"fmt"
	"time"

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

// deleteAndUndeleteTable demonstrates how to recover a deleted table by copying it from a point in time
// that predates the deletion event.
func deleteAndUndeleteTable(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()

	ds := client.Dataset(datasetID)
	if _, err := ds.Table(tableID).Metadata(ctx); err != nil {
		return err
	}
	// Record the current time.  We'll use this as the snapshot time
	// for recovering the table.
	snapTime := time.Now()

	// "Accidentally" delete the table.
	if err := client.Dataset(datasetID).Table(tableID).Delete(ctx); err != nil {
		return err
	}

	// Construct the restore-from tableID using a snapshot decorator.
	snapshotTableID := fmt.Sprintf("%s@%d", tableID, snapTime.UnixNano()/1e6)
	// Choose a new table ID for the recovered table data.
	recoverTableID := fmt.Sprintf("%s_recovered", tableID)

	// Construct and run a copy job.
	copier := ds.Table(recoverTableID).CopierFrom(ds.Table(snapshotTableID))
	copier.WriteDisposition = bigquery.WriteTruncate
	job, err := copier.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}

	ds.Table(recoverTableID).Delete(ctx)
	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.CopyJobConfiguration;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.TableId;

// Sample to undeleting a table
public class UndeleteTable {

  public static void runUndeleteTable() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_TABLE";
    String recoverTableName = "MY_RECOVER_TABLE_TABLE";
    undeleteTable(datasetName, tableName, recoverTableName);
  }

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

      // "Accidentally" delete the table.
      bigquery.delete(TableId.of(datasetName, tableName));

      // Record the current time.  We'll use this as the snapshot time
      // for recovering the table.
      long snapTime = System.currentTimeMillis();

      // Construct the restore-from tableID using a snapshot decorator.
      String snapshotTableId = String.format("%s@%d", tableName, snapTime);

      // Construct and run a copy job.
      CopyJobConfiguration configuration =
          CopyJobConfiguration.newBuilder(
                  // Choose a new table ID for the recovered table data.
                  TableId.of(datasetName, recoverTableName),
                  TableId.of(datasetName, snapshotTableId))
              .build();

      Job job = bigquery.create(JobInfo.of(configuration));
      job = job.waitFor();
      if (job.isDone() && job.getStatus().getError() == null) {
        System.out.println("Undelete table recovered successfully.");
      } else {
        System.out.println(
            "BigQuery was unable to copy the table due to an error: \n"
                + job.getStatus().getError());
        return;
      }
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Table not found. \n" + e.toString());
    }
  }
}

Node.js

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

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

async function undeleteTable() {
  // Undeletes "my_table_to_undelete" from "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // const tableId = "my_table_to_undelete";
  // const recoveredTableId = "my_recovered_table";

  /**
   * TODO(developer): Choose an appropriate snapshot point as epoch milliseconds.
   * For this example, we choose the current time as we're about to delete the
   * table immediately afterwards.
   */
  const snapshotEpoch = Date.now();

  // Delete the table
  await bigquery
    .dataset(datasetId)
    .table(tableId)
    .delete();

  console.log(`Table ${tableId} deleted.`);

  // Construct the restore-from table ID using a snapshot decorator.
  const snapshotTableId = `${tableId}@${snapshotEpoch}`;

  // Construct and run a copy job.
  await bigquery
    .dataset(datasetId)
    .table(snapshotTableId)
    .copy(bigquery.dataset(datasetId).table(recoveredTableId));

  console.log(
    `Copied data from deleted table ${tableId} to ${recoveredTableId}`
  );
}

Python

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

import time

from google.cloud import bigquery

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

# TODO(developer): Choose a table to recover.
# table_id = "your-project.your_dataset.your_table"

# TODO(developer): Choose a new table ID for the recovered table data.
# recovery_table_id = "your-project.your_dataset.your_table_recovered"

# TODO(developer): Choose an appropriate snapshot point as epoch
# milliseconds. For this example, we choose the current time as we're about
# to delete the table immediately afterwards.
snapshot_epoch = int(time.time() * 1000)

# ...

# "Accidentally" delete the table.
client.delete_table(table_id)  # Make an API request.

# Construct the restore-from table ID using a snapshot decorator.
snapshot_table_id = "{}@{}".format(table_id, snapshot_epoch)

# Construct and run a copy job.
job = client.copy_table(
    snapshot_table_id,
    recovered_table_id,
    # Must match the source and destination tables location.
    location="US",
)  # Make an API request.

job.result()  # Wait for the job to complete.

print(
    "Copied data from deleted table {} to {}".format(table_id, recovered_table_id)
)

次のステップ