管理数据集

本文档介绍了如何在 BigQuery 中管理数据集。 创建数据集后,您可以通过以下方式对其进行管理:

重命名数据集

目前,您无法更改现有数据集的名称,但可以复制数据集。请参阅复制数据集

复制数据集

如需查看复制数据集的步骤(包括跨区域复制),请参阅复制数据集

移动数据集

如需手动将数据集从一个位置移动到另一个位置,请按照以下流程操作:

  1. 将数据从 BigQuery 表导出到数据集所在位置的单区域或多区域 Cloud Storage 存储分区中。例如,如果您的数据集位于欧盟多区域位置,请将您的数据导出到位于欧盟的单区域或多区域存储分区中。

    从 BigQuery 导出数据不会产生费用,但是将导出的数据存储在 Cloud Storage 中会产生费用。BigQuery 导出操作需要遵循导出作业的相关限制。

  2. 将数据从 Cloud Storage 存储分区复制或移动到新位置的单区域或多区域存储分区中。例如,如果要将数据从美国多区域位置移动到东京单区域位置,则需要将数据转移到位于东京的单区域存储分区。如需了解如何转移 Cloud Storage 对象,请参阅 Cloud Storage 文档中的重命名、复制和移动对象

    请注意,在不同区域之间转移数据会在 Cloud Storage 中产生网络出站流量费用

  3. 将数据转移到新位置的 Cloud Storage 存储分区后,(在新位置)创建一个新的 BigQuery 数据集。然后,将数据从 Cloud Storage 存储分区加载到 BigQuery 中。

    将数据加载到 BigQuery 时,您无需为此操作支付费用,但在删除数据或存储分区之前,您需要支付在 Cloud Storage 中存储数据的费用。数据加载完毕后,在 BigQuery 中存储数据也须支付费用。将数据加载到 BigQuery 需要遵循加载作业的相关限制。

您还可以使用 Cloud Composer 以编程方式移动和复制大型数据集。

如需详细了解如何使用 Cloud Storage 存储和移动大型数据集,请参阅使用 Cloud Storage 处理大数据

删除数据集

您可以通过以下方式删除数据集:

  • 使用 Cloud Console 或经典版 BigQuery 网页界面
  • bq 命令行工具中使用 bq rm 命令
  • 调用 datasets.delete API 方法
  • 使用客户端库

所需权限

如需删除数据集,您必须至少拥有 bigquery.datasets.delete 权限。如果数据集包含表或视图,您还需要拥有 bigquery.tables.delete 权限。以下预定义的 IAM 角色同时具有 bigquery.datasets.deletebigquery.tables.delete 权限:

  • bigquery.dataOwner
  • bigquery.admin

此外,如果用户具有 bigquery.datasets.create 权限,则当该用户创建数据集时,系统会为其授予该数据集的 bigquery.dataOwner 访问权限。具有 bigquery.dataOwner 访问权限的用户可以删除其所创建的数据集和表。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅预定义的角色和权限

检查数据集是否存在

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.Dataset;
import com.google.cloud.bigquery.DatasetId;

// Sample to check dataset exist
public class DatasetExists {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    datasetExists(datasetName);
  }

  public static void datasetExists(String datasetName) {
    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(DatasetId.of(datasetName));
      if (dataset.exists()) {
        System.out.println("Dataset already exist");
      } else {
        System.out.println("Dataset not found");
      }
    } catch (BigQueryException e) {
      System.out.println("Dataset not found. \n" + e.toString());
    }
  }
}

Python

在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

from google.cloud import bigquery
from google.cloud.exceptions import NotFound

client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset to determine existence.
# dataset_id = "your-project.your_dataset"

try:
    client.get_dataset(dataset_id)  # Make an API request.
    print("Dataset {} already exists".format(dataset_id))
except NotFound:
    print("Dataset {} is not found".format(dataset_id))

删除数据集

使用 Cloud Console 或经典版网页界面删除数据集时,数据集中的表和视图(以及其中所含的数据)也会随之一起删除。当您使用 bq 命令行工具去删除数据集,则您必须使用 -r 标志来删除数据集的表和视图。

如需删除数据集,请执行以下操作:

控制台

  1. 资源窗格中选择您的数据集,然后点击窗口右侧的删除数据集

    删除数据集

  2. 删除数据集对话框中,将数据集的名称输入到文本框中,然后点击删除

经典版界面

  1. 点击导航窗格中数据集名称旁边的向下箭头图标 向下箭头图标,然后点击 Delete dataset

  2. Delete Dataset 对话框中执行以下操作:

    • Dataset ID 中,输入要删除的数据集的名称。
    • 点击 OK

bq

搭配使用 bq rm 命令和(可选)--dataset-d 快捷方式标志来删除数据集。当您使用 bq 命令行工具移除数据集时,您必须确认该命令。您可以使用 -f 标志跳过确认。

此外,如果数据集包含表,您必须使用 -r 标志移除数据集中的所有表。如果您要删除非默认项目中的表,请按以下格式将相应项目 ID 添加到数据集名称中:project_id:dataset

bq rm -r -f -d <var>project_id:dataset</var>

其中:

  • project_id 是您的项目 ID。
  • dataset 是要删除的数据集的名称。

示例:

输入以下命令可从您的默认项目中移除 mydataset 及其所含的全部表。该命令选用了 -d 快捷方式。

bq rm -r -d mydataset

出现提示时,请输入 y 并按 Enter 键。

输入以下命令可从 myotherproject 中移除 mydataset 及其所含的全部表。该命令未选用 -d 快捷方式。-f 标志用于跳过确认。

bq rm -r -f myotherproject:mydataset

API

调用 datasets.delete 方法来删除数据集,并将 deleteContents 参数设置为 true 来删除其中所含的表。

C#

在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 C# 设置说明进行操作。如需了解详情,请参阅 BigQuery C# API 参考文档


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

public class BigQueryDeleteDataset
{
    public void DeleteDataset(
        string projectId = "your-project-id",
        string datasetId = "your_empty_dataset"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        // Delete a dataset that does not contain any tables
        client.DeleteDataset(datasetId: datasetId);
        Console.WriteLine($"Dataset {datasetId} deleted.");
    }
}

Go

在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档

import (
	"context"
	"fmt"

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

// deleteDataset demonstrates the deletion of an empty dataset.
func deleteDataset(projectID, datasetID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	ctx := context.Background()

	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	// To recursively delete a dataset and contents, use DeleteWithContents.
	if err := client.Dataset(datasetID).Delete(ctx); err != nil {
		return fmt.Errorf("Delete: %v", err)
	}
	return nil
}

Java

试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQuery.DatasetDeleteOption;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.DatasetId;

public class DeleteDataset {

  public static void runDeleteDataset() {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    deleteDataset(projectId, datasetName);
  }

  public static void deleteDataset(String projectId, String datasetName) {
    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();

      DatasetId datasetId = DatasetId.of(projectId, datasetName);
      boolean success = bigquery.delete(datasetId, DatasetDeleteOption.deleteContents());
      if (success) {
        System.out.println("Dataset deleted successfully");
      } else {
        System.out.println("Dataset was not found");
      }
    } catch (BigQueryException e) {
      System.out.println("Dataset 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 deleteDataset() {
  // Deletes a dataset named "my_dataset".

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

  // Create a reference to the existing dataset
  const dataset = bigquery.dataset(datasetId);

  // Delete the dataset and its contents
  await dataset.delete({force: true});
  console.log(`Dataset ${dataset.id} 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';

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

Python

在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档


from google.cloud import bigquery

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

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

# Use the delete_contents parameter to delete a dataset and its contents.
# Use the not_found_ok parameter to not receive an error if the dataset has already been deleted.
client.delete_dataset(
    dataset_id, delete_contents=True, not_found_ok=True
)  # Make an API request.

print("Deleted dataset '{}'.".format(dataset_id))

Ruby

在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Ruby 设置说明进行操作。如需了解详情,请参阅 BigQuery Ruby API 参考文档

require "google/cloud/bigquery"

def delete_dataset dataset_id = "my_empty_dataset"
  bigquery = Google::Cloud::Bigquery.new

  # Delete a dataset that does not contain any tables
  dataset = bigquery.dataset dataset_id
  dataset.delete
  puts "Dataset #{dataset_id} deleted."
end

后续步骤

  • 如需详细了解如何创建数据集,请参阅创建数据集
  • 如需详细了解如何更新数据集,请参阅更新数据集
  • 如需详细了解如何复制数据集(包括跨区域复制),请参阅复制数据集