データセットのコピー

データを抽出して移動してから BigQuery に再読み込みする代わりに、データセットを同じリージョン内で、またはあるリージョンから別のリージョンにコピーできます。1 回だけコピーすることはもちろん、任意に指定した定期的なスケジュールでコピーすることも可能です。

始める前に

データセットのコピーを作成する前に、次のことを行います。

  • データセットのコピーには、BigQuery Data Transfer Service の機能を使用します。宛先データセットの Google Cloud プロジェクトで、BigQuery Data Transfer Service の有効化に必要なすべての操作が完了していることを確認します。
  • コピー先データセットとして、コピー元データセットと同じリージョンまたは異なるリージョンに BigQuery データセットを作成します。データセットの作成時に、BigQuery データを保存するロケーションを指定します。データセットのコピーができるリージョンはまだ限られています(サポートされているリージョンをご覧ください)。データセット名はプロジェクトごとに一意である必要があります。
  • コピー元のデータセットの ID と、コピー元のプロジェクトの ID を探します。
  • Pub/Sub の転送実行通知を設定する場合は、pubsub.topics.setIamPolicy 権限が必要です。メール通知を設定するだけの場合、Pub/Sub の権限は必要ありません。詳細については、BigQuery Data Transfer Service の実行通知をご覧ください。
  • overwrite_destination_table フラグを使ってコピー時にコピー先のテーブルを上書きする場合は、どちらのテーブルにも同じパーティショニング スキーマが必要です。

必要な権限

データセットのコピーを作成する前に、その操作を行うユーザーに対して次の BigQuery 権限が付与されていることを確認します。

  • コピー転送を作成するプロジェクトに対する bigquery.transfers.update 権限と bigquery.jobs.create 権限。

  • コピー元データセットに対する bigquery.datasets.get 権限。

  • コピー先データセットに対する bigquery.datasets.get 権限、bigquery.datasets.update 権限、bigquery.tables.create 権限。

プロジェクト レベルの IAM 事前定義ロールの bigquery.admin には、データセットのコピーに必要なすべての権限が含まれています。BigQuery での IAM ロールの詳細については、事前定義ロールと権限または IAM 権限のリファレンスをご覧ください。

データセットのコピーの設定

データセットのコピーを作成するには:

Console

オプション 1: [データセットをコピー] アイコンを使用する。

  1. Cloud Console の BigQuery ページに移動します。

    [BigQuery] ページに移動

  2. コピー元のデータセットの名前を選択します。

  3. [Copy Dataset] アイコンをクリックします。

    [データセットをコピー] アイコン。

  4. [データセットをコピー] ダイアログで、プロジェクト ID とコピー先データセットの ID を選択します。プロジェクトとデータセットは異なるリージョンに存在していてもかまいませんが、リージョンを越えたコピーができるのは一部のリージョンのみに限られます

  5. プロジェクト内のデータセット名は一意である必要があります。

  6. コピー先データセットのすべてのデータを更新(上書き)する場合は、[Overwrite destination table] チェックボックスをオンにします。テーブルとスキーマの両方が上書きされます。

    [Copy dataset] ダイアログ。

  7. 余分なストレージ コストがかからないようにするため、古いデータセットを削除することを検討してください。

オプション 2: [転送] ボタンを使用する。

  1. Cloud Console の BigQuery ページに移動します。

    [BigQuery] ページに移動

  2. [転送] をクリックします。

  3. [+ 転送を作成] をクリックします。

  4. [転送の作成] ページで、次の操作を行います。

    • [ソースタイプ] セクションの [ソース] で、[Dataset Copy] を選択します。

      転送のソース。

    • [転送構成名] セクションの [表示名] に、転送名(例: My Transfer)を入力します。転送名には、後で修正が必要になった場合に簡単に識別できる任意の名前を使用できます。

      転送名。

    • [スケジュール オプション] セクションで、[スケジュール] をデフォルト値([すぐに開始可能])のままにするか、[設定した時間に開始] をクリックします。

      • [繰り返しの頻度] で、転送を実行する頻度のオプションを選択します。次のオプションがあります。

        • 毎日(デフォルト)
        • 毎週
        • 毎月
        • カスタム
        • オンデマンド

        [毎日] 以外のオプションを選択した場合は、追加のオプションが利用可能です。たとえば、[毎週] を選択した場合、曜日を選択するためのオプションが表示されます。[カスタム] を選択すると、cron と似た方法での時間指定を求められます(例: every 12 hours)。最短許容時間は 12 時間です。

      • [開始日と実行時間] に、転送を開始する日付と時刻を入力します。[すぐに開始可能] を選択した場合、このフィールドは変更できません。

        転送スケジュール。

    • [宛先データセット] で、データを保存するために別のリージョンに作成したデータセットを選択します。

    • [ソース データセット] に、コピーするデータセットの名前を入力します。

    • [ソース プロジェクト] に、コピー元データセットが存在するプロジェクトの ID を入力します。

    • (省略可)コピー先データセットのすべてのデータを更新(上書き)する場合は、[コピー先テーブルを上書きする] チェックボックスをオンにします。テーブルとスキーマの両方が上書きされます。

      新しいデータセット コピー。

    • (省略可)[通知オプション] セクションで、次の操作を行います。

      • 切り替えボタンをクリックしてメール通知を有効にします。このオプションを有効にすると、転送の実行が失敗した場合、転送管理者にメール通知が送信されます。
      • [Pub/Sub トピックを選択してください] で、トピック名を選択するか、[トピックを作成する] をクリックしてトピックを作成します。このオプションで、Pub/Sub の転送実行通知を構成します。

      Pub/Sub トピック。

  5. [保存] をクリックします。

  6. 余分なストレージ コストがかからないようにするため、古いデータセットを削除することを検討してください。

bq

bq mk コマンドを入力して、転送作成フラグ --transfer_config を指定します。次のフラグも必要です。

  • --project_id
  • --data_source
  • --target_dataset
  • --display_name
  • --params

    bq mk --transfer_config --project_id=PROJECT_ID --data_source=DATA_SOURCE --target_dataset=DATASET --display_name=NAME --params='PARAMETERS'
    

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

  • PROJECT_ID: Google Cloud プロジェクト ID。--project_id を指定しない場合は、デフォルトのプロジェクトが使用されます。
  • DATA_SOURCE: データソース cross_region_copy
  • DATASET: 転送構成の BigQuery ターゲット データセット。
  • NAME: コピージョブ(転送構成)の表示名。転送名には、後で修正が必要になった場合に簡単に識別できる任意の名前を使用できます。
  • PARAMETERS には、作成される転送構成のパラメータを JSON 形式で指定します(例: --params='{"param":"param_value"}')。データセットをコピーする場合は source_dataset_id パラメータと source_project_id パラメータを指定する必要があり、必要に応じて overwrite_destination_table パラメータを指定します。

データセット コピー構成のパラメータは次のとおりです。

  • source_dataset_id: コピーするデータセットの ID。
  • source_project_id: コピー元データセットがあるプロジェクトの ID。
  • (省略可)overwrite_destination_table: 以前のコピーのテーブルを切り捨て、すべてのデータを更新する場合は、このパラメータを使用します。

たとえば次のコマンドは、mydataset というコピー先データセットと myproject という ID のプロジェクトを使用して My Transfer という名前のデータセット コピー構成を作成します。

bq mk --transfer_config --project_id=myproject --data_source=cross_region_copy --target_dataset=mydataset --display_name='My Dataset Copy' --params='{"source_dataset_id":"123_demo_eu","source_project_id":"mysourceproject","overwrite_destination_table":"true"}'

bq mk コマンドの詳細については、コマンドライン ツール リファレンスをご覧ください。

API

projects.locations.transferConfigs.create メソッドを使用して、TransferConfig リソースのインスタンスを指定します。

Java

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

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.CreateTransferConfigRequest;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.ProjectName;
import com.google.cloud.bigquery.datatransfer.v1.TransferConfig;
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

// Sample to copy dataset from another gcp project
public class CopyDataset {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String destinationProjectId = "MY_DESTINATION_PROJECT_ID";
    final String destinationDatasetId = "MY_DESTINATION_DATASET_ID";
    final String sourceProjectId = "MY_SOURCE_PROJECT_ID";
    final String sourceDatasetId = "MY_SOURCE_DATASET_ID";
    Map<String, Value> params = new HashMap<>();
    params.put("source_project_id", Value.newBuilder().setStringValue(sourceProjectId).build());
    params.put("source_dataset_id", Value.newBuilder().setStringValue(sourceDatasetId).build());
    TransferConfig transferConfig =
        TransferConfig.newBuilder()
            .setDestinationDatasetId(destinationDatasetId)
            .setDisplayName("Your Dataset Copy Name")
            .setDataSourceId("cross_region_copy")
            .setParams(Struct.newBuilder().putAllFields(params).build())
            .setSchedule("every 24 hours")
            .build();
    copyDataset(destinationProjectId, transferConfig);
  }

  public static void copyDataset(String projectId, TransferConfig transferConfig)
      throws IOException {
    try (DataTransferServiceClient dataTransferServiceClient = DataTransferServiceClient.create()) {
      ProjectName parent = ProjectName.of(projectId);
      CreateTransferConfigRequest request =
          CreateTransferConfigRequest.newBuilder()
              .setParent(parent.toString())
              .setTransferConfig(transferConfig)
              .build();
      TransferConfig config = dataTransferServiceClient.createTransferConfig(request);
      System.out.println("Copy dataset created successfully :" + config.getName());
    } catch (ApiException ex) {
      System.out.print("Copy dataset was not created." + ex.toString());
    }
  }
}

Python

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

pip install google-cloud-bigquery-datatransfer を使用して BigQuery Data Transfer API 用の Python クライアントをインストールします。次に、データセットをコピーするための転送構成を作成します。
from google.cloud import bigquery_datatransfer

transfer_client = bigquery_datatransfer.DataTransferServiceClient()

destination_project_id = "my-destination-project"
destination_dataset_id = "my_destination_dataset"
source_project_id = "my-source-project"
source_dataset_id = "my_source_dataset"
transfer_config = bigquery_datatransfer.TransferConfig(
    destination_dataset_id=destination_dataset_id,
    display_name="Your Dataset Copy Name",
    data_source_id="cross_region_copy",
    params={
        "source_project_id": source_project_id,
        "source_dataset_id": source_dataset_id,
    },
    schedule="every 24 hours",
)
transfer_config = transfer_client.create_transfer_config(
    parent=transfer_client.common_project_path(destination_project_id),
    transfer_config=transfer_config,
)
print(f"Created transfer config: {transfer_config.name}")

データセット コピージョブの表示と更新

[転送] で、データセットのコピーの進行状況と詳細を見ることができます。

Console

コンソールの転送ボタン。

コンソールの転送詳細の表示。

データセット コピー更新ジョブは、ユーザーが指定したスケジュールで実行されるようスケジュールされます。これは構成可能です。デフォルトは 24 時間ごとです。新しい実行をすぐに実行する場合は、[その他] メニューをクリックし、[今すぐ更新] をクリックします。

データセット コピーの更新ボタン

料金

データセットのコピーは、ベータ期間中は無料で利用できます。

一般提供時には、リージョン間でコピーされたデータに対して、Compute Engine ネットワークのリージョン間の下り(外向き)と同じ料金が適用されます。

リージョン間のコピーではデータを圧縮して送信するため、課金される GB 数はデータセットのサイズより小さくなる場合があります。

詳しくは、BigQuery の料金をご覧ください。

割り当てと上限

BigQuery データセットのコピーには、次の割り当てと制限が適用されます。

コピーの割り当て

データセットをコピーするには、データセット内のテーブルごとに 1 つのコピージョブが必要です。

テーブルのコピーに関する BigQuery ジョブには、次の上限が適用されます。各上限は、bq コマンドライン ツール、Cloud Console、または copy-type の jobs.insert API メソッドで作成されたジョブに適用されます。成功か失敗かに関係なく、すべてのコピージョブがこの上限にカウントされます。

上限 デフォルト
宛先テーブルごとの 1 日あたりコピージョブ数 1 日のテーブル オペレーションをご覧ください。
1 日あたりのコピージョブ数 100,000 ジョブ 1 日あたりプロジェクトで最大 100,000 個のコピージョブを実行できます。
宛先テーブルあたりの 1 日のリージョン間コピージョブの数 100 ジョブ プロジェクトでは、宛先テーブルに対して 1 日あたり 100 個までのリージョン間コピージョブを実行できます。
1 日あたりのリージョン間コピージョブ 2,000 ジョブ プロジェクトで 1 日あたり最大 2,000 件のリージョン間コピージョブを実行できます。

データセットのコピーには、以下の上限が適用されます。

上限 デフォルト
コピー元データセット内の最大テーブル数 20,000 個のテーブル コピー元データセットには、最大 20,000 個のテーブルを含めることができます。
実行ごとに同じリージョン内の宛先データセットにコピーできる最大テーブル数 20,000 個のテーブル プロジェクトでは、同じリージョンにある宛先データセットに、実行あたり 20,000 個のテーブルをコピーできます。
実行間で別のリージョンの宛先データセットにコピーできる最大テーブル数 1,000 個のテーブル 実行ごとに 1,000 個のテーブルを異なるリージョンの宛先データセットにコピーできます。8,000 個のテーブルを含むデータセットのリージョン間コピーを構成すると、BigQuery Data Transfer Service により 8 個の実行単位が順次自動的に作成されます。最初の実行で 1,000 個のテーブルがコピーされます。24 時間後の 2 回目の実行で 1,000 個のテーブルがコピーされます。このプロセスは、データセット内のすべてのテーブルがコピーされるまで(データセットあたり最大 20,000 個のテーブルがコピーされるまで)継続されます。

詳細については、コピージョブをご覧ください。

一般的な制限事項

  • データセット コピーの転送構成を作成する前に、コピー先データセットを作成する必要があります。

  • データセット コピー構成ごとに、一度にアクティブにできるコピーは 1 つだけです。追加の転送実行はキューに入れられます。

データ型の制限

  • ビューのコピーはサポートされていません。
  • 外部テーブルのコピーはサポートされていません。
  • ストリーミング バッファ内のストレージのコピーはサポートされていません。
  • 顧客管理の暗号鍵で暗号化されたテーブルをコピーできるかどうかは、同じリージョン内でコピーするか異なるリージョン間でコピーするかによって異なります。

リージョン内

同じリージョン内でデータセットをコピーする場合は、顧客管理の暗号鍵(CMEK)で暗号化されたテーブルを含む暗号化されたテーブルをコピーできます。

リージョン間

デフォルトの暗号化を使用したテーブルについては、リージョン間でコピーできます。現時点では、顧客管理の暗号鍵(CMEK)で暗号化されたテーブルをリージョン間でコピーすることはできません。コピー先データセットにテーブルをコピーするときに、CMEK で暗号化されたテーブルはスキップされます。

宛先データセットの制限事項

顧客管理の暗号鍵(CMEK)を持つデータセットは、リージョン間でコピーするときに宛先として使用できません。ただし、CMEK を含むテーブルは、リージョン内でコピーする場合の宛先として使用できます。

テーブルの制限事項

  • パーティション分割テーブルのコピーは現在サポートされています。ただし、パーティション分割テーブルへのデータの追加はサポートされていません。

  • コピー元データセットとコピー先データセットにある同じテーブルの内容が、最後にコピーが成功してから変更されていない場合、そのテーブルはスキップされます。これは、[コピー先テーブルを上書きする] ボックスがチェックされている場合でも同様です。

  • テーブルを切り捨てる場合は、データセットのコピーが開始される前に、コピー先データセットに加えられた変更は確認されません。コピー先データセット内のすべてのデータが更新(上書き)されます。テーブルとスキーマの両方が上書きされます。

    • overwrite_destination_table フラグを使ってコピー時にコピー先のテーブルを上書きする場合は、どちらのテーブルにも同じパーティショニング スキーマが必要です。

サポートされるリージョン

ロケーションには、2 つの種類があります。

  • リージョンは、ロンドンなどの特定の地理的な場所となります。

  • マルチリージョンは、米国などの、2 つ以上の地理的な場所を含む広い地理的なエリアとなります。

データセットのコピーは、リージョンからリージョン、単一リージョンからマルチリージョン、マルチリージョンから単一リージョン、マルチリージョンからマルチリージョンに対して行うことができます。

現在、データセットのコピーができるリージョンは限られています。以下に示すように、データセットのコピーは BigQuery Data Transfer Service が現在サポートされているリージョンでのみ作成できます。

リージョンのロケーション

リージョンの説明 リージョン名
南北アメリカ
アイオワ us-central1 リーフアイコン 低 CO2
ラスベガス us-west4
ロサンゼルス us-west2
モントリオール northamerica-northeast1 リーフアイコン 低 CO2
北バージニア us-east4
オレゴン us-west1 リーフアイコン 低 CO2
ソルトレイクシティ us-west3
サンパウロ southamerica-east1 リーフアイコン 低 CO2
サウスカロライナ us-east1
トロント northamerica-northeast2
ヨーロッパ
ベルギー europe-west1 リーフアイコン 低 CO2
フィンランド europe-north1 リーフアイコン 低 CO2
フランクフルト europe-west3
ロンドン europe-west2
オランダ europe-west4
ワルシャワ europe-central2
チューリッヒ europe-west6 リーフアイコン 低 CO2
アジア太平洋
デリー asia-south2
香港 asia-east2
ジャカルタ asia-southeast2
メルボルン australia-southeast2
ムンバイ asia-south1
大阪 asia-northeast2
ソウル asia-northeast3
シンガポール asia-southeast1
シドニー australia-southeast1
台湾 asia-east1
東京 asia-northeast1

マルチリージョン

マルチリージョンの説明 マルチリージョン名
欧州連合の加盟国内のデータセンター1 EU
米国内のデータセンター US

1 EU マルチリージョン内のデータは europe-west2(ロンドン)や europe-west6(チューリッヒ)のデータセンターには保存されません。

データセットのセキュリティ

BigQuery でデータセットへのアクセスを制御するには、データセットへのアクセスの制御をご覧ください。 データ暗号化の詳細については、保存データの暗号化をご覧ください。

次のステップ

  • 転送構成に関する情報の取得、転送構成の一覧表示、転送の実行履歴の表示など、転送の使用方法の詳細については、転送の操作をご覧ください。