管理作业

提交 BigQuery 作业后,您可以查看作业详细信息列出作业取消作业重复作业删除作业元数据

作业提交时,作业可能处于下列其中一种状态:

  • PENDING:作业已安排并且正在等待运行。
  • RUNNING:作业正在处理中。
  • DONE:作业已完成。如果作业完成并且没有出现错误,则 BigQuery 会将此状态报告为 SUCCESS。如果作业完成并且出现错误,则 BigQuery 会将此状态报告为 FAILURE

准备工作

授予为用户提供执行本文档中的每个任务所需权限的 Identity and Access Management (IAM) 角色。 执行任务所需的权限(如果有)列出在任务的“所需权限”部分中。

查看作业详情

您可以使用 Google Cloud 控制台、bq 命令行工具、API 或客户端库查看作业详细信息。详细信息包括数据和元数据,例如作业类型、作业状态和创建作业的用户。

所需权限

如需查看作业详细信息,您需要拥有 bigquery.jobs.get IAM 权限。 系统会自动针对您创建的作业为您授予此权限。

以下每个预定义 IAM 角色都包含查看作业详细信息所需的权限:

  • roles/bigquery.admin(可让您查看项目中所有作业的详细信息)
  • roles/bigquery.user(可让您查看您的作业的详细信息)
  • roles/bigquery.jobUser(可让您查看您的作业的详细信息)

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

查看作业详情

如需查看作业详细信息,请执行以下操作:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 选择要查看的作业历史记录类型:

    • 如需显示近期作业的信息,请点击个人历史记录
    • 如需显示项目中近期作业的信息,请点击项目历史记录
  3. 如需查看作业详细信息,请点击作业。

bq

发出带有 --job=true 标志和作业 ID 的 bq show 命令。

提供作业 ID 时,您可以使用完全限定的 ID 或者简写形式。例如,Google Cloud 控制台中列出的作业 ID 为完全限定格式,即其中包含项目和位置:

my-project-1234:US.bquijob_123x456_123y123z123c

命令行工具中列出的作业 ID 使用简写形式,其中不包含项目 ID 和位置:

bquijob_123x456_123y123z123c

要指定作业位置,请提供 --location 标志并将其值设置为您选择的位置。如果您使用完全限定的作业 ID,则此标志为可选标志。如果在添加 --location 标志的同时使用完全限定的作业 ID,则系统将忽略 --location 标志。

以下命令用于请求有关作业的信息:

bq --location=LOCATION show --job=true JOB_ID

替换以下内容:

  • LOCATION:运行作业的位置的名称。例如,如果您在东京地区使用 BigQuery,请将该标志的值设置为 asia-northeast1。您可以使用 .bigqueryrc 文件设置位置的默认值。 如果该位置未指定为作业 ID 的一部分或使用 --location 标志,则使用默认位置。
  • JOB_ID:作业的 ID

示例

以下命令用于获取有关 myproject 中运行的作业 US.bquijob_123x456_123y123z123c 的摘要信息:

bq show --job=true myproject:US.bquijob_123x456_123y123z123c

输出类似于以下内容:

 Job Type    State      Start Time      Duration      User Email       Bytes Processed   Bytes Billed   Billing Tier   Labels
 ---------- --------- ----------------- ---------- ------------------- ----------------- -------------- -------------- --------
 extract    SUCCESS   06 Jul 11:32:10   0:01:41    user@example.com

要查看完整的作业详细信息,请输入以下命令:

bq show --format=prettyjson --job=true myproject:US.bquijob_123x456_789y123z456c

输出类似于以下内容:

{
  "configuration": {
    "extract": {
      "compression": "NONE",
      "destinationUri": "[URI removed]",
      "destinationUris": [
        "[URI removed]"
      ],
      "sourceTable": {
        "datasetId": "github_repos",
        "projectId": "bigquery-public-data",
        "tableId": "commits"
      }
    }
  },
  "etag": "\"[etag removed]\"",
  "id": "myproject:bquijob_123x456_789y123z456c",
  "jobReference": {
    "jobId": "bquijob_123x456_789y123z456c",
    "projectId": "[Project ID removed]"
  },
  "kind": "bigquery#job",
  "selfLink": "https://bigquery.googleapis.com/bigquery/v2/projects/federated-testing/jobs/bquijob_123x456_789y123z456c",
  "statistics": {
    "creationTime": "1499365894527",
    "endTime": "1499365894702",
    "startTime": "1499365894702"
  },
  "status": {
    "errorResult": {
      "debugInfo": "[Information removed for readability]",
      "message": "Operation cannot be performed on a nested schema. Field: author",
      "reason": "invalid"
    },
    "errors": [
      {
        "message": "Operation cannot be performed on a nested schema. Field: author",
        "reason": "invalid"
      }
    ],
    "state": "DONE"
  },
  "user_email": "user@example.com"
}

API

调用 jobs.get 并提供 jobIdprojectId 参数。(可选)提供 location 参数并将值设置为运行作业的位置。如果使用的是包含位置的完全限定作业 ID(例如 my-project-1234:US.bquijob_123x456_123y123z123c),则此参数为可选项。

Go

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

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

import (
	"context"
	"fmt"
	"io"

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

// getJobInfo demonstrates retrieval of a job, which can be used to monitor
// completion or print metadata about the job.
func getJobInfo(w io.Writer, projectID, jobID string) error {
	// projectID := "my-project-id"
	// jobID := "my-job-id"
	ctx := context.Background()

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

	job, err := client.JobFromID(ctx, jobID)
	if err != nil {
		return err
	}

	status := job.LastStatus()
	state := "Unknown"
	switch status.State {
	case bigquery.Pending:
		state = "Pending"
	case bigquery.Running:
		state = "Running"
	case bigquery.Done:
		state = "Done"
	}
	fmt.Fprintf(w, "Job %s was created %v and is in state %s\n",
		jobID, status.Statistics.CreationTime, state)
	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.Job;
import com.google.cloud.bigquery.JobId;

// Sample to get a job
public class GetJob {

  public static void runGetJob() {
    // TODO(developer): Replace these variables before running the sample.
    String jobName = "MY_JOB_NAME";
    getJob(jobName);
  }

  public static void getJob(String jobName) {
    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();

      JobId jobId = JobId.of(jobName);
      Job job = bigquery.getJob(jobId);
      System.out.println("Job retrieved successfully");
    } catch (BigQueryException e) {
      System.out.println("Job not retrieved. \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 getJob() {
  // Get job properties.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const jobId = "existing-job-id";

  // Create a job reference
  const job = bigquery.job(jobId);

  // Retrieve job
  const [jobResult] = await job.get();

  console.log(jobResult.metadata.jobReference);
}

Python

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

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

from google.cloud import bigquery

def get_job(
    client: bigquery.Client,
    location: str = "us",
    job_id: str = "abcd-efgh-ijkl-mnop",
) -> None:
    job = client.get_job(job_id, location=location)

    # All job classes have "location" and "job_id" string properties.
    # Use these properties for job operations such as "cancel_job" and
    # "delete_job".
    print(f"{job.location}:{job.job_id}")
    print(f"Type: {job.job_type}")
    print(f"State: {job.state}")
    print(f"Created: {job.created.isoformat()}")

如果您需要更多信息来排查作业问题,请参阅 INFORMATION_SCHEMA.JOBS* 视图日志

列出项目中的作业

BigQuery 会为项目的所有作业保存六个月的历史记录。

您可以通过以下方式查看作业历史记录:

此作业记录包含状态为 RUNNINGDONE(通过报告状态为 SUCCESSFAILURE 来表示)的作业。

所需权限

如需列出您在项目中创建的所有作业,您需要拥有 bigquery.jobs.create IAM 权限。如需列出所有用户在项目中创建的所有作业,您需要拥有 bigquery.jobs.list IAM 权限。您只能查看自己创建的作业的完整详细信息。其他用户创建的作业的详细信息会被隐去。

以下每个预定义 IAM 角色都包含列出作业所需的权限:

  • roles/bigquery.admin(可让您列出项目中的所有作业)
  • roles/bigquery.user(可让您列出项目中的所有作业)
  • roles/bigquery.jobUser(可让您列出您的作业)

如需列出项目中的所有作业(包括其详细信息),您需要拥有 bigquery.jobs.listAll IAM 权限。

以下每个预定义 IAM 角色都包含列出所有作业(包括其详细信息)所需的权限:

  • roles/bigquery.admin
  • roles/bigquery.resourceAdmin

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

列出作业

BigQuery 会列出所有位置的作业。

如需列出项目中的作业,请执行以下操作:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 如需列出项目中的所有作业,请点击项目历史记录。如果您不是项目所有者,则可能无权查看项目的所有作业。最新作业列在前面。

  3. 如需列出您的作业,请点击个人历史记录

bq

发出带有以下标志之一的 bq ls 命令:

  • --jobs=true-j:将作业标识为要列出的资源类型。
  • --all=true-a:列出来自所有用户的作业。要查看所有作业的全部(未遮盖)详细信息,您必须具有 bigquery.jobs.listAll 权限。
  • --min_creation_time:列出在提供的时间戳值之后提交的作业。此值以 Unix 纪元时间戳表示(以毫秒为单位)。
  • --max_creation_time:列出在提供的时间戳值之前提交的作业。此值以 Unix 纪元时间戳表示(以毫秒为单位)。
  • --max_results-n 用于限制结果。默认值为 50 个结果。
bq ls --jobs=true --all=true \
    --min_creation_time=MIN_TIME \
    --max_creation_time=MAX_TIME \
    --max_results=MAX_RESULTS \
    PROJECT_ID

请替换以下内容:

  • MIN_TIME:一个整数,表示 Unix 纪元时间戳(以毫秒为单位)。
  • MAX_TIME:一个整数,表示 Unix 纪元时间戳(以毫秒为单位)。
  • MAX_RESULTS:一个整数,表示返回的作业数。
  • PROJECT_ID:您要列出的作业所在项目的 ID。如果您设置了默认项目,则无需提供 PROJECT_ID 参数。

示例

以下命令用于列出当前用户的所有作业。运行此命令需要 bigquery.jobs.list 权限。

bq ls --jobs=true myproject

以下命令用于列出所有用户的所有作业。运行此命令需要 bigquery.jobs.listAll 权限。

bq ls --jobs=true --all=true myproject

以下命令用于列出 myproject 中最新的 10 个作业:

bq ls --jobs=true --all=true --max_results=10 myproject

以下命令列出了在 2032 年 3 月 3 日凌晨 4:04:00 之前提交的所有作业。此时间戳(以毫秒为单位)等效于以下整数值:1961899440000

bq ls --jobs=true --max_creation_time=1961899440000

API

调用 jobs.list 并提供 projectId 参数。要列出所有用户的作业,请将 allUsers 参数设置为 true。将 allUsers 设置为 true 需要 bigquery.jobs.listAll 权限。

Go

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

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
	"google.golang.org/api/iterator"
)

// listJobs demonstrates iterating through the BigQuery jobs collection.
func listJobs(w io.Writer, projectID string) error {
	// projectID := "my-project-id"
	// jobID := "my-job-id"
	ctx := context.Background()

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

	it := client.Jobs(ctx)
	// List up to 10 jobs to demonstrate iteration.
	for i := 0; i < 10; i++ {
		j, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return err
		}
		state := "Unknown"
		switch j.LastStatus().State {
		case bigquery.Pending:
			state = "Pending"
		case bigquery.Running:
			state = "Running"
		case bigquery.Done:
			state = "Done"
		}
		fmt.Fprintf(w, "Job %s in state %s\n", j.ID(), state)
	}
	return nil
}

Java

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

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

import com.google.api.gax.paging.Page;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Job;

// Sample to get list of jobs
public class ListJobs {

  public static void runListJobs() {
    listJobs();
  }

  public static void listJobs() {
    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();

      Page<Job> jobs = bigquery.listJobs(BigQuery.JobListOption.pageSize(10));
      if (jobs == null) {
        System.out.println("Dataset does not contain any jobs.");
        return;
      }
      jobs.getValues().forEach(job -> System.out.printf("Success! Job ID: %s", job.getJobId()));
    } catch (BigQueryException e) {
      System.out.println("Jobs not listed in dataset due to error: \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 listJobs() {
  // Lists all jobs in current GCP project.

  // List the 10 most recent jobs in reverse chronological order.
  //  Omit the max_results parameter to list jobs from the past 6 months.
  const options = {maxResults: 10};
  const [jobs] = await bigquery.getJobs(options);

  console.log('Jobs:');
  jobs.forEach(job => console.log(job.id));
}

Python

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

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证


from google.cloud import bigquery

import datetime

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

# List the 10 most recent jobs in reverse chronological order.
# Omit the max_results parameter to list jobs from the past 6 months.
print("Last 10 jobs:")
for job in client.list_jobs(max_results=10):  # API request(s)
    print("{}".format(job.job_id))

# The following are examples of additional optional parameters:

# Use min_creation_time and/or max_creation_time to specify a time window.
print("Jobs from the last ten minutes:")
ten_mins_ago = datetime.datetime.utcnow() - datetime.timedelta(minutes=10)
for job in client.list_jobs(min_creation_time=ten_mins_ago):
    print("{}".format(job.job_id))

# Use all_users to include jobs run by all users in the project.
print("Last 10 jobs run by all users:")
for job in client.list_jobs(max_results=10, all_users=True):
    print("{} run by user: {}".format(job.job_id, job.user_email))

# Use state_filter to filter by job state.
print("Last 10 jobs done:")
for job in client.list_jobs(max_results=10, state_filter="DONE"):
    print("{}".format(job.job_id))

取消作业

您可以通过以下方式取消 RUNNINGPENDING 作业:

  • 使用 Google Cloud 控制台。
  • 使用 bq cancel 命令。
  • 在 SQL 查询中使用 BQ.JOBS.CANCEL 系统过程。
  • 通过调用 jobs.cancel API 方法。
  • 使用客户端库。

并非所有类型的作业都可以取消。如果作业无法取消,将返回一个错误。

即使作业可以取消,也不保证操作一定成功。作业可能在提交取消请求之前就已完成,或者作业可能处于无法取消的阶段。

所需权限

如需取消作业,您需要拥有 bigquery.jobs.update IAM 权限。 系统会自动针对您创建的作业为您授予此权限。

以下每个预定义 IAM 角色都包含取消作业所需的权限:

  • roles/bigquery.admin(可让您取消项目中的任何作业)
  • roles/bigquery.user(可让您取消您的作业)
  • roles/bigquery.jobUser(可让您取消您的作业)

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

取消作业

通常,只需不到一分钟即可完成作业取消操作。

如需取消作业,请执行以下操作:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 点击编写新查询并输入查询。

  3. 如需运行查询,请点击运行

  4. 如需取消作业,请点击取消

SQL

使用 BQ.JOBS.CANCEL 系统过程:

  CALL BQ.JOBS.CANCEL('JOB_ID');

JOB_ID 替换为您要取消的作业的 ID。

如果您属于其他项目,但位于要取消的作业所在的地区,则还必须添加项目 ID:

  CALL BQ.JOBS.CANCEL('PROJECT_ID.JOB_ID');

替换以下内容:

  • PROJECT_ID:要取消的作业所属项目的 ID
  • JOB_ID:要取消作业的 ID

该过程会立即返回结果,并且 BigQuery 会在随后的较短时间内取消作业。如果作业已成功或失败,则该过程不会产生任何作用。

bq

发出带有 JOB_ID 参数的 bq cancel 命令。您可以使用 --nosync=true 标志请求取消后立即返回。默认情况下,系统将等待取消请求完成。

提供 JOB_ID 参数时,您可以使用完全限定的 ID 或者简写形式。例如,Google Cloud 控制台中列出的作业 ID 为完全限定格式,即其中包含项目和位置:

my-project-1234:US.bquijob_123x456_123y123z123c

bq 命令行工具中列出的作业 ID 使用简写形式,其中不包含项目 ID 和位置:

bquijob_123x456_123y123z123c

要指定作业位置,请提供 --location 标志并将其值设置为您选择的位置。如果您使用完全限定的作业 ID,则此标志为可选标志。如果在添加 --location 标志的同时使用完全限定的作业 ID,则系统将忽略 --location 标志。

以下命令用于请求取消作业并等待操作完成。如果已提供完全限定的作业 ID,则系统将忽略 --location 标志:

bq --location=LOCATION cancel JOB_ID

以下命令用于请求取消作业后立即返回。如果已提供完全限定的作业 ID,则系统将忽略 --location 标志:

bq --location=LOCATION --nosync cancel JOB_ID

替换以下内容:

  • LOCATION(可选):作业运行的位置的名称。例如,如果您在东京地区使用 BigQuery,请将该标志的值设置为 asia-northeast1。您可以使用 .bigqueryrc 文件设置位置的默认值。
  • JOB_ID:要取消作业的 ID。如果您从 Google Cloud 控制台复制作业 ID,则作业 ID 中将包含项目 ID 和位置。例如 my-project-1234:US.bquijob_123x456_123y123z123c

示例

以下命令用于取消 my-project-1234 项目中 US 多区域位置运行的作业 my-project-1234:US.bquijob_123x456_123y123z123c 并等待操作完成。由于使用的是完全限定的作业 ID,无需提供 location 标志。

bq cancel my-project-1234:US.bquijob_123x456_123y123z123c

以下命令用于取消 my-project-1234 项目中在 US 多区域位置运行的作业 bquijob_123x456_123y123z123c 并等待操作完成。由于使用的是简写形式的作业 ID,需要提供 --location 标志。

bq --location=US cancel bquijob_123x456_123y123z123c

以下命令用于取消 my-project-1234 项目中 US 多区域位置运行的作业 bquijob_123x456_123y123z123c 并立即返回结果。由于使用的是完全限定的作业 ID,无需提供 --location 标志。

bq --nosync cancel my-project-1234:US.bquijob_123x456_123y123z123c

API

调用 jobs.cancel 并提供 jobIdprojectId 参数。提供 location 参数并将值设置为运行作业的位置

Go

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

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

import (
	"context"
	"fmt"

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

// cancelJob demonstrates how a job cancellation request can be issued for a specific
// BigQuery job.
func cancelJob(projectID, jobID string) error {
	// projectID := "my-project-id"
	// jobID := "my-job-id"
	ctx := context.Background()

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

	job, err := client.JobFromID(ctx, jobID)
	if err != nil {
		return nil
	}
	return job.Cancel(ctx)
}

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.Job;
import com.google.cloud.bigquery.JobId;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.QueryJobConfiguration;
import java.util.UUID;

// Sample to cancel a job
public class CancelJob {

  public static void runCancelJob() {
    // TODO(developer): Replace these variables before running the sample.
    String query = "SELECT country_name from `bigquery-public-data.utility_us.country_code_iso`";
    cancelJob(query);
  }

  public static void cancelJob(String query) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      // Specify a job configuration to set optional job resource properties.
      QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(query).build();

      // The location and job name are optional,
      // if both are not specified then client will auto-create.
      String jobName = "jobId_" + UUID.randomUUID().toString();
      JobId jobId = JobId.newBuilder().setLocation("us").setJob(jobName).build();

      // Create a job with job ID
      bigquery.create(JobInfo.of(jobId, queryConfig));

      // Get a job that was just created
      Job job = bigquery.getJob(jobId);
      if (job.cancel()) {
        System.out.println("Job canceled successfully");
      } else {
        System.out.println("Job was not canceled");
      }
    } catch (BigQueryException e) {
      System.out.println("Job was not canceled.\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 cancelJob() {
  // Attempts to cancel a job.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const jobId = "existing-job-id";

  // Create a job reference
  const job = bigquery.job(jobId);

  // Attempt to cancel job
  const [apiResult] = await job.cancel();

  console.log(apiResult.job.status);
}

Python

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

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

from google.cloud import bigquery

def cancel_job(
    client: bigquery.Client,
    location: str = "us",
    job_id: str = "abcd-efgh-ijkl-mnop",
) -> None:
    job = client.cancel_job(job_id, location=location)
    print(f"{job.location}:{job.job_id} cancelled")

删除作业元数据

您可以使用 bq 命令行工具和 Python 客户端库删除特定作业的元数据。BigQuery 会保留过去 6 个月内执行的作业的历史记录。您可以使用此方法移除查询语句中可能存在的敏感信息。作业元数据只能在作业完成后删除。如果作业创建了子作业,则子作业也会被删除。不允许删除子作业。只能删除父级或顶级作业。

所需权限

如需删除作业元数据,您需要拥有 bigquery.jobs.delete IAM 权限。

预定义 IAM 角色 roles/bigquery.admin 包含删除作业元数据所需的权限。

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

删除作业元数据

bq

发出带有 -j 标志和作业 ID 的 bq rm 命令。

提供作业 ID 时,您可以使用完全限定的 ID 或者简写形式。例如,Google Cloud 控制台中列出的作业 ID 为完全限定格式,即其中包含项目和位置:

my-project-1234:US.bquijob_123x456_123y123z123c

bq 命令行工具中列出的作业 ID 使用简写形式,其中不包含项目 ID 和位置:

bquijob_123x456_123y123z123c

要指定作业位置,请提供 --location 标志并将其值设置为您选择的位置。如果您使用完全限定的作业 ID,则此标志为可选标志。如果在添加 --location 标志的同时使用完全限定的作业 ID,则系统将忽略 --location 标志。

以下命令可删除作业:

bq --location=location \
    --project_id=project_id \
    rm -j job_id

Python

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

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

from google.api_core import exceptions
from google.cloud import bigquery

# TODO(developer): Set the job ID to the ID of the job whose metadata you
#                  wish to delete.
job_id = "abcd-efgh-ijkl-mnop"

# TODO(developer): Set the location to the region or multi-region
#                  containing the job.
location = "us-east1"

client = bigquery.Client()

client.delete_job_metadata(job_id, location=location)

try:
    client.get_job(job_id, location=location)
except exceptions.NotFound:
    print(f"Job metadata for job {location}:{job_id} was deleted.")

重复作业

不能使用相同的作业 ID 重复作业。只能使用相同的配置新建一个作业。在 Google Cloud 控制台或 bq 命令行工具中提交新作业时,系统会分配新的作业 ID。如果您使用 API 或客户端库提交作业,则您必须生成新的作业 ID。

所需权限

如需运行作业,您需要拥有 bigquery.jobs.create IAM 权限。

以下每个预定义 IAM 角色都包含运行作业所需的权限:

  • roles/bigquery.admin
  • roles/bigquery.user
  • roles/bigquery.jobUser

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

重复作业

如需重复某个作业,请执行以下操作:

控制台

如需重复查询作业,请执行以下操作:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 如需列出所有作业,请点击个人历史记录。如需列出项目中的所有作业,请点击项目历史记录

  3. 点击一个查询作业以打开该作业的详细信息。

  4. 如需重复执行某个查询,请点击作为新查询打开

  5. 点击运行

如需重复加载作业,请执行以下操作:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 如需列出所有作业,请点击个人历史记录。如需列出项目中的所有作业,请点击项目历史记录

  3. 点击一个加载作业以打开该作业的详细信息。

  4. 如需重复运行某个作业,请点击重复加载作业

bq

再次发出命令,BigQuery 会自动生成使用新作业 ID 的作业。

API

重复运行作业的操作无法通过单次调用方法完成;如果您想重复运行某个特定作业,请执行以下操作:

  1. 调用 jobs.get 以检索重复运行该作业所需的资源。

  2. 移除 id、status 和 statistics 字段。 将 jobId 字段更改为客户端代码生成的新值。根据需要对其他任何字段进行更改。

  3. 使用修改后的资源和新作业 ID 调用 jobs.insert 以启动新作业。