安排查询

本页面介绍如何在 BigQuery 中安排周期性查询。

您可以计划查询定期运行。计划查询必须使用 GoogleSQL 编写,其中可包括数据定义语言 (DDL)数据操纵语言 (DML) 语句。您可以通过参数化查询字符串和目标表来按日期和时间组织查询结果。

创建或更新查询的时间表时,查询的计划时间会从您的本地时间转换为世界协调时间 (UTC)。世界协调时间 (UTC) 不受夏令时的影响。

准备工作

所需权限

如需安排查询,您需要以下 IAM 权限:

  • 如需创建转移作业,您必须拥有 bigquery.transfers.updatebigquery.datasets.get 权限,或者拥有 bigquery.jobs.createbigquery.transfers.getbigquery.datasets.get 权限。

  • 要运行计划查询,您必须拥有:

    • 针对目标数据集的 bigquery.datasets.get 权限
    • bigquery.jobs.create

如需修改或删除计划查询,您需要以下 IAM 权限之一:

  • bigquery.transfers.update
  • 计划查询的 bigquery.jobs.create 和所有权

预定义的 roles/bigquery.admin IAM 角色包含安排或修改查询所需的权限。

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

如需创建或更新服务账号运行的计划查询,您必须拥有该服务账号的访问权限。如需详细了解如何为用户授予服务账号角色,请参阅服务账号用户角色。如需在 Google Cloud 控制台的计划查询界面中选择服务账号,您需要拥有以下 IAM 权限:

  • iam.serviceAccounts.list

配置选项

查询字符串

查询字符串必须有效,且必须使用 GoogleSQL 编写。计划查询每次运行时,都会收到以下查询参数

如需在计划查询之前使用 @run_time@run_date 参数手动测试查询字符串,请使用 bq 命令行工具。

可用参数

参数 GoogleSQL 类型
@run_time TIMESTAMP 以世界协调时间 (UTC) 表示。对于定期运行的计划查询,run_time 表示预期执行时间。例如,如果计划查询设置为“每 24 小时”,则连续两次查询之间的 run_time 差值将正好为 24 小时,虽然实际的执行耗时可能略有不同。
@run_date DATE 表示逻辑日历日期。

示例

以下示例查询名为 hacker_news.stories 的公共数据集,其中 @run_time 参数是查询字符串的一部分。

SELECT @run_time AS time,
  title,
  author,
  text
FROM `bigquery-public-data.hacker_news.stories`
LIMIT
  1000

目标表

在您设置计划查询时,如果结果的目标表不存在,BigQuery 会尝试为您创建表。

如果您使用的是 DDL 或 DML 查询,则在 Google Cloud 控制台中选择处理位置或区域。创建目标表的 DDL 或 DML 查询需要具有处理位置。

如果目标表已存在,并且您使用的是 WRITE_APPEND 写入偏好设置,则 BigQuery 会将数据附加到目标表并尝试映射架构。BigQuery 会自动允许添加字段和重新排序字段,并适应缺失的可选字段。如果表架构在两次运行之间发生了很大变化,以致于 BigQuery 无法自动处理更改,则计划查询会失败。

查询可以引用不同项目和不同数据集中的表。配置计划查询时,无需在表名称中包括目标数据集。您可以单独指定目标数据集。

计划查询的目标数据集和表必须与计划查询位于同一项目中。

写入偏好设置

您选择的写入偏好设置决定了将查询结果写入现有目标表的方式。

  • WRITE_TRUNCATE:如果相关表已存在,BigQuery 会覆盖表数据。
  • WRITE_APPEND:如果相关表已存在,BigQuery 会向此表附加数据。

如果您使用的是 DDL 或 DML 查询,则无法使用“写入偏好设置”选项。

仅当 BigQuery 能够成功完成查询时,才会创建、截断或附加目标表。作业完成时,创建、截断或附加操作会作为原子更新发生。

聚簇

当使用 DDL CREATE TABLE AS SELECT 语句创建表时,计划查询只能在新表上创建聚簇。请参阅使用数据定义语言语句页面上的基于查询结果创建聚簇表

分区选项

计划查询可以创建分区或非分区目标表。Google Cloud 控制台、bq 命令行工具和 API 设置方法提供了分区功能。如果您使用的是带分区功能的 DDL 或 DML 查询,请将目标表分区字段留空。

您可以在 BigQuery 中使用以下类型的表分区:

如需在 Google Cloud 控制台中使用计划查询创建分区表,请使用以下选项:

  • 如需使用整数范围分区,请将目标表分区字段留空。

  • 如需使用时间单位列分区,请在设置计划查询时,在目标表分区字段中指定列名称。

  • 如需使用注入时间分区,请将目标表分区字段留空,并在目标表名称中指明日期分区。例如 mytable${run_date}。如需了解详情,请参阅参数模板语法

可用参数

设置计划查询时,您可以使用运行时参数指定对目标表进行分区的方式。

参数 模板类型
run_time 带格式的时间戳 采用世界协调时间 (UTC),基于计划。对于定期运行的计划查询,run_time 表示预期执行时间。例如,如果计划查询设置为“每 24 小时”,则连续两次查询之间的 run_time 差值将正好为 24 小时,虽然实际的执行耗时可能略有不同。

请参阅 TransferRun.runTime
run_date 日期字符串 run_time 参数的日期格式为 %Y-%m-%d,例如 2018-01-01。此格式与注入时间分区表兼容。

模板系统

计划查询支持通过模板语法在目标表名称中采用运行时参数。

参数模板语法

模板语法支持基本的字符串模板和时间偏移量设置。您可以采用以下格式来引用参数:

  • {run_date}
  • {run_time[+\-offset]|"time_format"}
参数 用途
run_date 此参数将替换成格式为 YYYYMMDD 的日期。
run_time 此参数支持以下属性:


offset
按小时 (h)、分钟 (m) 和秒 (s) 的顺序表示的时间偏移量。
不支持天 (d)。
允许使用小数,例如 1.5h

time_format
带格式的字符串。最常见的格式参数是年 (%Y)、月 (%m) 和日 (%d)。
对于分区表,YYYYMMDD 是必需的后缀,等效于“%Y%m%d”。

详细了解带格式的 datetime 元素

使用说明
  • run_time、offset 和 time_format 之间不允许有空格。
  • 如需在字符串中包含文本大括号,您可以将其转义为 '\{' and '\}'
  • 如需在 time_format 中包含文本引号或竖线(例如 "YYYY|MM|DD"),您可以在格式字符串中将其转义为 '\"''\|'

参数模板示例

以下示例演示了如何使用不同的时间格式指定目标表名称,以及如何设置运行时间的偏移量。
run_time (UTC) 模板化参数 输出目标表名称
2018-02-15 00:00:00 mytable mytable
2018-02-15 00:00:00 mytable_{run_time|"%Y%m%d"} mytable_20180215
2018-02-15 00:00:00 mytable_{run_time+25h|"%Y%m%d"} mytable_20180216
2018-02-15 00:00:00 mytable_{run_time-1h|"%Y%m%d"} mytable_20180214
2018-02-15 00:00:00 mytable_{run_time+1.5h|"%Y%m%d%H"}

mytable_{run_time+90m|"%Y%m%d%H"}
mytable_2018021501
2018-02-15 00:00:00 {run_time+97s|"%Y%m%d"}_mytable_{run_time+97s|"%H%M%S"} 20180215_mytable_000137

使用服务账号

您可以设置计划查询来使用服务账号进行身份验证。服务账号是与您的 Google Cloud 项目关联的 Google 账号。服务账号可以使用自己的服务凭据(而不是最终用户的凭据)运行作业(例如计划查询或批处理流水线)。

要详细了解使用服务账号进行身份验证,请阅读身份验证简介

  • 您可以使用服务账号设置预定查询。如果您使用联合身份登录,则需要有服务账号才能创建转移作业。如果您使用 Google 账号登录,则转移作业的服务账号是可选的。

  • 您可以使用 bq 命令行工具或 Google Cloud 控制台通过服务账号的凭据更新现有预定查询。如需了解详情,请参阅更新预定查询凭据

使用预定查询指定加密密钥

您可以指定客户管理的加密密钥 (CMEK) 来加密转移作业运行的数据。您可以使用 CMEK 支持来自计划查询的转移作业。

当您使用转移作业指定 CMEK 时,BigQuery Data Transfer Service 会将 CMEK 应用于所注入数据的任何中间磁盘缓存,从而使整个数据转移工作流符合 CMEK 的规定。

如果最初不是使用 CMEK 创建转移作业,则无法更新现有转移作业来添加 CMEK。例如,您无法将最初默认加密的目标表更改为现在使用 CMEK 加密。反之,您也无法更改 CMEK 加密的目标表,使其具有不同类型的加密。

如果转移配置最初是使用 CMEK 加密创建的,则可以为转移作业更新 CMEK。当您为转移配置更新 CMEK 时,BigQuery Data Transfer Service 会在下次运行转移作业时将 CMEK 传播到目标表,其中 BigQuery Data Transfer Service 会在转移作业运行期间将所有过时的 CMEK 替换为新的 CMEK。如需了解详情,请参阅更新转移作业

您还可以使用项目默认密钥。当您使用转移作业指定项目默认密钥时,BigQuery Data Transfer Service 会将项目默认密钥用作任何新转移配置的默认密钥。

设置计划查询

如需了解时间表语法,请参阅设置时间表的格式。 如需详细了解时间表语法,请参阅“资源:TransferConfig

控制台

  1. 在 Google Cloud 控制台中打开 BigQuery 页面。

    转到 BigQuery

  2. 运行所需查询。如果您对结果感到满意,请点击计划查询创建新的计划查询

    在 Google Cloud 控制台中创建新的计划查询。

  3. 计划查询选项在新建计划查询窗格中打开。 新的计划查询窗格。

  4. 新建计划查询窗格上:

    • 对于计划查询的名称,请输入一个名称,例如 My scheduled query。计划查询的名称可以是您以后在需要修改查询时可识别的任何值。
    • 可选:默认情况下,计划运行每天查询。您可以从重复下拉菜单中选择一个选项,以更改默认时间表:

      • 如需指定自定义频率,请选择自定义,然后在自定义时间表字段中输入类似 Cron 的时间规范;例如 every mon 23:30every 6 hours。如需详细了解有效时间表(包括自定义间隔时间),请参阅“资源:TransferConfig下的 schedule 字段。

        设置自定义计划查询的格式。

      • 如需更改开始时间,请选择从设置的时间开始选项,输入所需的开始日期和时间。

      • 如需指定结束时间,请选择安排结束时间选项,输入所需的结束日期和时间。

      • 如需在没有时间表的情况下保存查询,以便稍后可以按需运行查询,请在重复菜单中选择按需

  5. 对于 GoogleSQL SELECT 查询,请选择为查询结果设置目标表选项,并提供目标数据集的以下相关信息。

    • 数据集名称部分,选择适当的目标数据集。
    • 对于表名称,请输入目标表的名称。
    • 对于目标表的写入偏好设置,请选择附加到表以将数据附加到表中,或选择覆盖表以覆盖目标表。
    • 对于 DDL 和 DML 查询,请选择处理位置或区域。

      新的计划查询目标。

  6. 高级选项

    • 可选:CMEK 如果您使用客户管理的加密密钥,您可以选择高级选项下的客户管理的密钥。系统会显示一系列可用的 CMEK 供您选择。 如需了解客户管理的加密密钥 (CMEK) 如何与 BigQuery Data Transfer Service 搭配使用,请参阅使用预定查询指定加密密钥

    • 使用服务账号进行身份验证:如果您有一个或多个服务账号与 Google Cloud 项目关联,则可以将服务账号与预定查询相关联,而不是使用用户凭据。在预定查询凭据下,点击菜单可查看可用服务账号列表。 如果您以联合身份登录,则需要服务账号。

      预定查询的高级选项

  7. 其他配置:

    • 可选:勾选发送电子邮件通知,让系统在转移作业运行失败时发送电子邮件通知。

    • 可选:在 Pub/Sub 主题部分,请输入您的 Pub/Sub 主题名称,例如,projects/myproject/topics/mytopic

      新的计划查询 DDL 和 DML。

  8. 点击计划按钮。

bq

方法 1:使用 bq query 命令。

要创建计划查询,请将选项 destination_table(或 target_dataset)、--schedule--display_name 添加到您的 bq query 命令。

bq query \
--display_name=name \
--destination_table=table \
--schedule=interval

替换以下内容:

  • name。计划查询的显示名。显示名可以是您以后在需要修改查询时可识别的任何值。
  • table。查询结果的目标表。
    • 使用 DDL 和 DML 查询时,您还可以使用 --target_dataset 为查询结果命名目标数据集。
    • 请使用 --destination_table--target_dataset,但不要同时使用这两者。
  • interval:与 bq query 一起使用时,可将查询设为周期性计划查询。需要有关查询运行频率的计划。 如需详细了解有效时间表(包括自定义间隔时间),请参阅“资源:TransferConfig下的 schedule 字段。示例:
    • --schedule='every 24 hours'
    • --schedule='every 3 hours'
    • --schedule='every monday 09:00'
    • --schedule='1st sunday of sep,oct,nov 00:00'

可选标志:

  • --project_id 是项目 ID。如果未指定 --project_id,系统会使用默认项目。

  • --replace 会截断目标表,并在计划查询每次运行时写入新结果。

  • --append_table 会将结果附加到目标表。

  • 对于 DDL 和 DML 查询,您还可以提供 --location 标志以指定要处理的特定区域。如果未指定 --location,则使用最近的 Google Cloud 位置。

例如,以下命令会使用简单查询 SELECT 1 from mydataset.test 创建名为 My Scheduled Query 的计划查询。目标表是数据集 mydataset 中的 mytable。计划查询将在默认项目中创建:

    bq query \
    --use_legacy_sql=false \
    --destination_table=mydataset.mytable \
    --display_name='My Scheduled Query' \
    --schedule='every 24 hours' \
    --replace=true \
    'SELECT
      1
    FROM
      mydataset.test'


方法 2:使用 bq mk 命令。

计划查询是一种转移作业。如需计划查询,您可以使用 bq 命令行工具创建转移作业配置。

拟安排的计划查询必须使用 StandardSQL 方言。

输入 bq mk 命令并提供以下必需标志:

  • --transfer_config
  • --data_source
  • --target_dataset(对于 DDL 和 DML 查询,此标志是可选的)
  • --display_name
  • --params

可选标志:

  • --project_id 是项目 ID。如果未指定 --project_id,系统会使用默认项目。

  • --schedule 是您希望查询运行的频率。如果未指定 --schedule,则默认基于创建时间“每 24 小时运行一次”。

  • 对于 DDL 和 DML 查询,您还可以提供 --location 标志以指定要处理的特定区域。如果未指定 --location,则使用最近的 Google Cloud 位置。

  • --service_account_name 用于通过服务账号而不是您的个人用户账号对计划查询进行身份验证。

  • 如果您将客户管理的加密密钥 (CMEK) 用于此转移作业,则 --destination_kms_key 会指定密钥的密钥资源 ID。如需了解 CMEK 如何与 BigQuery Data Transfer Service 搭配使用,请参阅使用计划查询指定加密密钥

bq mk \
--transfer_config \
--target_dataset=dataset \
--display_name=name \
--params='parameters' \
--data_source=data_source

替换以下内容:

  • dataset。转移作业配置的目标数据集。
    • 对于 DDL 和 DML 查询,此参数是可选的。所有其他查询都必须设置此参数。
  • name。转移作业配置的显示名。显示名可以是您以后在需要修改查询时可识别的任何值。
  • parameters。包含所创建转移作业配置的参数(采用 JSON 格式),例如:--params='{"param":"param_value"}'
    • 对于计划查询,您必须提供 query 参数。
    • destination_table_name_template 参数是您的目标表的名称。
      • 对于 DDL 和 DML 查询,此参数是可选的。所有其他查询都必须设置此参数。
    • 对于 write_disposition 参数,您可以选择使用 WRITE_TRUNCATE 截断(覆盖)目标表,或选择使用 WRITE_APPEND 将查询结果附加到目标表。
      • 对于 DDL 和 DML 查询,此参数是可选的。所有其他查询都必须设置此参数。
  • data_source。数据源:scheduled_query
  • 可选:--service_account_name 标志用于通过服务账号而不是个人用户账号进行身份验证。
  • 可选:--destination_kms_key 指定了 Cloud KMS 密钥的密钥资源 ID,例如 projects/project_name/locations/us/keyRings/key_ring_name/cryptoKeys/key_name

例如,以下命令会使用简单查询 SELECT 1 from mydataset.test 创建名为 My Scheduled Query 的计划查询转移作业配置。目标表 mytable 会在每次写入时被截断,而目标数据集为 mydataset。计划查询将在默认项目中创建,并使用服务账号进行身份验证:

bq mk \
--transfer_config \
--target_dataset=mydataset \
--display_name='My Scheduled Query' \
--params='{"query":"SELECT 1 from mydataset.test","destination_table_name_template":"mytable","write_disposition":"WRITE_TRUNCATE"}' \
--data_source=scheduled_query \
--service_account_name=abcdef-test-sa@abcdef-test.iam.gserviceaccount.com

首次运行此命令时,您会收到如下消息:

[URL omitted] Please copy and paste the above URL into your web browser and follow the instructions to retrieve an authentication code.

请按照该消息中的说明操作,并将身份验证代码粘贴到命令行中。

API

使用 projects.locations.transferConfigs.create 方法并提供一个 TransferConfig 资源实例。

Java

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Java API 参考文档

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

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 create a scheduled query
public class CreateScheduledQuery {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String projectId = "MY_PROJECT_ID";
    final String datasetId = "MY_DATASET_ID";
    final String query =
        "SELECT CURRENT_TIMESTAMP() as current_time, @run_time as intended_run_time, "
            + "@run_date as intended_run_date, 17 as some_integer";
    Map<String, Value> params = new HashMap<>();
    params.put("query", Value.newBuilder().setStringValue(query).build());
    params.put(
        "destination_table_name_template",
        Value.newBuilder().setStringValue("my_destination_table_{run_date}").build());
    params.put("write_disposition", Value.newBuilder().setStringValue("WRITE_TRUNCATE").build());
    params.put("partitioning_field", Value.newBuilder().build());
    TransferConfig transferConfig =
        TransferConfig.newBuilder()
            .setDestinationDatasetId(datasetId)
            .setDisplayName("Your Scheduled Query Name")
            .setDataSourceId("scheduled_query")
            .setParams(Struct.newBuilder().putAllFields(params).build())
            .setSchedule("every 24 hours")
            .build();
    createScheduledQuery(projectId, transferConfig);
  }

  public static void createScheduledQuery(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("\nScheduled query created successfully :" + config.getName());
    } catch (ApiException ex) {
      System.out.print("\nScheduled query was not created." + ex.toString());
    }
  }
}

Python

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Python API 参考文档

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

from google.cloud import bigquery_datatransfer

transfer_client = bigquery_datatransfer.DataTransferServiceClient()

# The project where the query job runs is the same as the project
# containing the destination dataset.
project_id = "your-project-id"
dataset_id = "your_dataset_id"

# This service account will be used to execute the scheduled queries. Omit
# this request parameter to run the query as the user with the credentials
# associated with this client.
service_account_name = "abcdef-test-sa@abcdef-test.iam.gserviceaccount.com"

# Use standard SQL syntax for the query.
query_string = """
SELECT
  CURRENT_TIMESTAMP() as current_time,
  @run_time as intended_run_time,
  @run_date as intended_run_date,
  17 as some_integer
"""

parent = transfer_client.common_project_path(project_id)

transfer_config = bigquery_datatransfer.TransferConfig(
    destination_dataset_id=dataset_id,
    display_name="Your Scheduled Query Name",
    data_source_id="scheduled_query",
    params={
        "query": query_string,
        "destination_table_name_template": "your_table_{run_date}",
        "write_disposition": "WRITE_TRUNCATE",
        "partitioning_field": "",
    },
    schedule="every 24 hours",
)

transfer_config = transfer_client.create_transfer_config(
    bigquery_datatransfer.CreateTransferConfigRequest(
        parent=parent,
        transfer_config=transfer_config,
        service_account_name=service_account_name,
    )
)

print("Created scheduled query '{}'".format(transfer_config.name))

使用服务账号设置计划查询

Java

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Java API 参考文档

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

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 create a scheduled query with service account
public class CreateScheduledQueryWithServiceAccount {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String projectId = "MY_PROJECT_ID";
    final String datasetId = "MY_DATASET_ID";
    final String serviceAccount = "MY_SERVICE_ACCOUNT";
    final String query =
        "SELECT CURRENT_TIMESTAMP() as current_time, @run_time as intended_run_time, "
            + "@run_date as intended_run_date, 17 as some_integer";
    Map<String, Value> params = new HashMap<>();
    params.put("query", Value.newBuilder().setStringValue(query).build());
    params.put(
        "destination_table_name_template",
        Value.newBuilder().setStringValue("my_destination_table_{run_date}").build());
    params.put("write_disposition", Value.newBuilder().setStringValue("WRITE_TRUNCATE").build());
    params.put("partitioning_field", Value.newBuilder().build());
    TransferConfig transferConfig =
        TransferConfig.newBuilder()
            .setDestinationDatasetId(datasetId)
            .setDisplayName("Your Scheduled Query Name")
            .setDataSourceId("scheduled_query")
            .setParams(Struct.newBuilder().putAllFields(params).build())
            .setSchedule("every 24 hours")
            .build();
    createScheduledQueryWithServiceAccount(projectId, transferConfig, serviceAccount);
  }

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

Python

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Python API 参考文档

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

from google.cloud import bigquery_datatransfer

transfer_client = bigquery_datatransfer.DataTransferServiceClient()

# The project where the query job runs is the same as the project
# containing the destination dataset.
project_id = "your-project-id"
dataset_id = "your_dataset_id"

# This service account will be used to execute the scheduled queries. Omit
# this request parameter to run the query as the user with the credentials
# associated with this client.
service_account_name = "abcdef-test-sa@abcdef-test.iam.gserviceaccount.com"

# Use standard SQL syntax for the query.
query_string = """
SELECT
  CURRENT_TIMESTAMP() as current_time,
  @run_time as intended_run_time,
  @run_date as intended_run_date,
  17 as some_integer
"""

parent = transfer_client.common_project_path(project_id)

transfer_config = bigquery_datatransfer.TransferConfig(
    destination_dataset_id=dataset_id,
    display_name="Your Scheduled Query Name",
    data_source_id="scheduled_query",
    params={
        "query": query_string,
        "destination_table_name_template": "your_table_{run_date}",
        "write_disposition": "WRITE_TRUNCATE",
        "partitioning_field": "",
    },
    schedule="every 24 hours",
)

transfer_config = transfer_client.create_transfer_config(
    bigquery_datatransfer.CreateTransferConfigRequest(
        parent=parent,
        transfer_config=transfer_config,
        service_account_name=service_account_name,
    )
)

print("Created scheduled query '{}'".format(transfer_config.name))

查看计划查询状态

控制台

如需查看计划查询的状态,请点击导航窗格中的计划查询。刷新页面即可查看计划查询的更新状态。点击计划查询可获取详细信息。

列出计划查询。

bq

计划查询是一种转移作业。如需显示计划查询的详细信息,您可以先使用 bq 命令行工具列出转移作业配置。

输入 bq ls 命令并提供转移作业标志 --transfer_config。此外,还必须提供以下标志:

  • --transfer_location

例如:

bq ls \
--transfer_config \
--transfer_location=us

如需显示单个计划查询的详细信息,请输入 bq show 命令并提供该计划查询/转移作业配置的 transfer_path

例如:

bq show \
--transfer_config \
projects/862514376110/locations/us/transferConfigs/5dd12f26-0000-262f-bc38-089e0820fe38

API

使用 projects.locations.transferConfigs.list 方法并提供一个 TransferConfig 资源实例。

Java

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Java API 参考文档

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

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.ListTransferConfigsRequest;
import com.google.cloud.bigquery.datatransfer.v1.ProjectName;
import java.io.IOException;

// Sample to get list of transfer config
public class ListTransferConfigs {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String projectId = "MY_PROJECT_ID";
    listTransferConfigs(projectId);
  }

  public static void listTransferConfigs(String projectId) throws IOException {
    try (DataTransferServiceClient dataTransferServiceClient = DataTransferServiceClient.create()) {
      ProjectName parent = ProjectName.of(projectId);
      ListTransferConfigsRequest request =
          ListTransferConfigsRequest.newBuilder().setParent(parent.toString()).build();
      dataTransferServiceClient
          .listTransferConfigs(request)
          .iterateAll()
          .forEach(config -> System.out.print("Success! Config ID :" + config.getName() + "\n"));
    } catch (ApiException ex) {
      System.out.println("Config list not found due to error." + ex.toString());
    }
  }
}

Python

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Python API 参考文档

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

from google.cloud import bigquery_datatransfer

transfer_client = bigquery_datatransfer.DataTransferServiceClient()

project_id = "my-project"
parent = transfer_client.common_project_path(project_id)

configs = transfer_client.list_transfer_configs(parent=parent)
print("Got the following configs:")
for config in configs:
    print(f"\tID: {config.name}, Schedule: {config.schedule}")

更新计划查询

控制台

要更新计划查询,请按以下步骤操作:

  1. 在导航窗格中,点击计划查询
  2. 在计划查询列表中,点击要更改的查询的名称。
  3. 在打开的计划查询详细信息页面上,点击修改修改计划查询详细信息。
  4. 可选:更改查询修改窗格中的查询文本。
  5. 点击计划查询,然后选择更新计划查询
  6. 可选:更改查询的任何其他时间安排选项。
  7. 点击更新

bq

计划查询是一种转移作业。如需更新计划查询,您可以使用 bq 命令行工具创建转移作业配置。

输入带有必需 --transfer_config 标志的 bq update 命令。

可选标志:

  • --project_id 是项目 ID。如果未指定 --project_id,系统会使用默认项目。

  • --schedule 是您希望查询运行的频率。如果未指定 --schedule,则默认基于创建时间“每 24 小时运行一次”。

  • --service_account_name 仅在同时设置了 --update_credentials 时才会生效。如需了解详情,请参阅更新预定查询凭据

  • 与 DDL 和 DML 查询搭配使用时,您还可以使用 --target_dataset(对于 DDL 和 DML 查询是可选的)为查询结果命名目标数据集。

  • --display_name 是计划查询的名称。

  • --params 是所创建转移作业配置的参数(采用 JSON 格式)。例如:--params='{"param":"param_value"}'。

  • 如果您将客户管理的加密密钥 (CMEK) 用于此转移作业,则 --destination_kms_key 会指定 Cloud KMS 密钥的密钥资源 ID。如需了解客户管理的加密密钥 (CMEK) 如何与 BigQuery Data Transfer Service 搭配使用,请参阅使用计划查询指定加密密钥

bq update \
--target_dataset=dataset \
--display_name=name \
--params='parameters'
--transfer_config \
RESOURCE_NAME

替换以下内容:

  • dataset。转移作业配置的目标数据集。对于 DDL 和 DML 查询,此参数是可选的。所有其他查询都必须设置此参数。
  • name。转移作业配置的显示名。显示名可以是您以后在需要修改查询时可识别的任何值。
  • parameters。包含所创建转移作业配置的参数(采用 JSON 格式),例如:--params='{"param":"param_value"}'
    • 对于计划查询,您必须提供 query 参数。
    • destination_table_name_template 参数是您的目标表的名称。 对于 DDL 和 DML 查询,此参数是可选的。 所有其他查询都必须设置此参数。
    • 对于 write_disposition 参数,您可以选择使用 WRITE_TRUNCATE 截断(覆盖)目标表,或选择使用 WRITE_APPEND 将查询结果附加到目标表。对于 DDL 和 DML 查询,此参数是可选的。所有其他查询都必须设置此参数。
  • 可选:--destination_kms_key 指定了 Cloud KMS 密钥的密钥资源 ID,例如 projects/project_name/locations/us/keyRings/key_ring_name/cryptoKeys/key_name
  • RESOURCE_NAME:转移作业的资源名称(也称为转移作业配置)。如果您不知道转移作业的资源名称,您可以通过以下命令查找资源名称:bq ls --transfer_config --transfer_location=location

例如,以下命令会使用简单查询 SELECT 1 from mydataset.test 更新名为 My Scheduled Query 的计划查询转移作业配置。目标表 mytable 会在每次写入时被截断,而目标数据集为 mydataset

bq update \
--target_dataset=mydataset \
--display_name='My Scheduled Query' \
--params='{"query":"SELECT 1 from mydataset.test","destination_table_name_template":"mytable","write_disposition":"WRITE_TRUNCATE"}'
--transfer_config \
projects/myproject/locations/us/transferConfigs/1234a123-1234-1a23-1be9-12ab3c456de7

API

使用 projects.transferConfigs.patch 方法并通过 transferConfig.name 参数提供转移作业的资源名称。如果您不知道转移作业的资源名称,请使用 bq ls --transfer_config --transfer_location=location 命令以列出所有转移作业,或调用 projects.locations.transferConfigs.list 方法并通过 parent 参数提供项目 ID。

Java

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Java API 参考文档

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

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.TransferConfig;
import com.google.cloud.bigquery.datatransfer.v1.UpdateTransferConfigRequest;
import com.google.protobuf.FieldMask;
import com.google.protobuf.util.FieldMaskUtil;
import java.io.IOException;

// Sample to update transfer config.
public class UpdateTransferConfig {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String configId = "MY_CONFIG_ID";
    TransferConfig transferConfig =
        TransferConfig.newBuilder()
            .setName(configId)
            .setDisplayName("UPDATED_DISPLAY_NAME")
            .build();
    FieldMask updateMask = FieldMaskUtil.fromString("display_name");
    updateTransferConfig(transferConfig, updateMask);
  }

  public static void updateTransferConfig(TransferConfig transferConfig, FieldMask updateMask)
      throws IOException {
    try (DataTransferServiceClient dataTransferServiceClient = DataTransferServiceClient.create()) {
      UpdateTransferConfigRequest request =
          UpdateTransferConfigRequest.newBuilder()
              .setTransferConfig(transferConfig)
              .setUpdateMask(updateMask)
              .build();
      TransferConfig updateConfig = dataTransferServiceClient.updateTransferConfig(request);
      System.out.println("Transfer config updated successfully :" + updateConfig.getDisplayName());
    } catch (ApiException ex) {
      System.out.print("Transfer config was not updated." + ex.toString());
    }
  }
}

Python

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Python API 参考文档

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

from google.cloud import bigquery_datatransfer
from google.protobuf import field_mask_pb2

transfer_client = bigquery_datatransfer.DataTransferServiceClient()

transfer_config_name = "projects/1234/locations/us/transferConfigs/abcd"
new_display_name = "My Transfer Config"

transfer_config = bigquery_datatransfer.TransferConfig(name=transfer_config_name)
transfer_config.display_name = new_display_name

transfer_config = transfer_client.update_transfer_config(
    {
        "transfer_config": transfer_config,
        "update_mask": field_mask_pb2.FieldMask(paths=["display_name"]),
    }
)

print(f"Updated config: '{transfer_config.name}'")
print(f"New display name: '{transfer_config.display_name}'")

使用所有权限制更新计划查询

如果您尝试更新不归您所有的计划查询,则更新可能会失败,并显示以下错误消息:

Cannot modify restricted parameters without taking ownership of the transfer configuration.

计划查询的所有者是与计划查询关联的用户,或者有权访问与计划查询关联的服务账号。您可以在计划查询的配置详细信息中查看关联用户。如需了解如何更新计划查询以获取所有权,请参阅更新计划查询凭据。如需向用户授予服务账号的访问权限,您必须具有 Service Account User 角色

任何不是计划查询的所有者,但有权访问查询提及的所有资源的用户仍然可能有权更新查询。仅当查询可在一两分钟内验证时,支持此场景。否则,您会收到与之前相同的错误消息。如果查询过于复杂,您可以更新计划查询凭据,以直接拥有计划查询的所有权或使用服务账号。

更新计划查询凭据

如果您计划的是现有查询,则可能需要更新该查询的用户凭据。对于新的计划查询,凭据会自动更新到最新状态。

以下是可能需要更新凭据的一些其他情况:

  • 您想要通过计划查询来查询 Google 云端硬盘数据
  • 当您尝试计划查询时,收到 INVALID_USER 错误:

    Error code 5 : Authentication failure: User Id not found. Error code: INVALID_USERID

  • 尝试更新查询时,您收到以下受限参数错误:

    Cannot modify restricted parameters without taking ownership of the transfer configuration.

控制台

如需刷新计划查询的现有凭据,请执行以下操作

  1. 查找并查看计划查询的状态

  2. 点击更多按钮并选择更新凭据

    更新计划查询凭据。

  3. 更改需要 10 到 20 分钟的时间才会生效。您可能需要清除浏览器的缓存。

bq

计划查询是一种转移作业。如需更新计划查询的凭据,您可以使用 bq 命令行工具更新转移作业配置。

输入 bq update 命令并提供转移作业标志 --transfer_config。此外,还必须提供以下标志:

  • --update_credentials

可选标志:

  • --service_account_name 用于通过服务账号而不是您的个人用户账号对计划查询进行身份验证。

例如,下列命令会更新计划查询转移作业配置以使用服务账号进行身份验证:

bq update \
--update_credentials \
--service_account_name=abcdef-test-sa@abcdef-test.iam.gserviceaccount.com
--transfer_config \
projects/myproject/locations/us/transferConfigs/1234a123-1234-1a23-1be9-12ab3c456de7

Java

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Java API 参考文档

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

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.TransferConfig;
import com.google.cloud.bigquery.datatransfer.v1.UpdateTransferConfigRequest;
import com.google.protobuf.FieldMask;
import com.google.protobuf.util.FieldMaskUtil;
import java.io.IOException;

// Sample to update credentials in transfer config.
public class UpdateCredentials {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String configId = "MY_CONFIG_ID";
    String serviceAccount = "MY_SERVICE_ACCOUNT";
    TransferConfig transferConfig = TransferConfig.newBuilder().setName(configId).build();
    FieldMask updateMask = FieldMaskUtil.fromString("service_account_name");
    updateCredentials(transferConfig, serviceAccount, updateMask);
  }

  public static void updateCredentials(
      TransferConfig transferConfig, String serviceAccount, FieldMask updateMask)
      throws IOException {
    try (DataTransferServiceClient dataTransferServiceClient = DataTransferServiceClient.create()) {
      UpdateTransferConfigRequest request =
          UpdateTransferConfigRequest.newBuilder()
              .setTransferConfig(transferConfig)
              .setUpdateMask(updateMask)
              .setServiceAccountName(serviceAccount)
              .build();
      dataTransferServiceClient.updateTransferConfig(request);
      System.out.println("Credentials updated successfully");
    } catch (ApiException ex) {
      System.out.print("Credentials was not updated." + ex.toString());
    }
  }
}

Python

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Python API 参考文档

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

from google.cloud import bigquery_datatransfer
from google.protobuf import field_mask_pb2

transfer_client = bigquery_datatransfer.DataTransferServiceClient()

service_account_name = "abcdef-test-sa@abcdef-test.iam.gserviceaccount.com"
transfer_config_name = "projects/1234/locations/us/transferConfigs/abcd"

transfer_config = bigquery_datatransfer.TransferConfig(name=transfer_config_name)

transfer_config = transfer_client.update_transfer_config(
    {
        "transfer_config": transfer_config,
        "update_mask": field_mask_pb2.FieldMask(paths=["service_account_name"]),
        "service_account_name": service_account_name,
    }
)

print("Updated config: '{}'".format(transfer_config.name))

设置历史日期的手动运行

除了计划要在将来运行的查询外,您还可以通过手动触发即刻运行。如果查询使用 run_date 参数,并且在先前的运行期间存在问题,则必须触发即刻运行。

例如,您每天 09:00 查询源表,以查找与当前日期匹配的行。但是,您发现过去三天的数据未添加到源表中。在此情况下,您可以设置对指定日期范围内的历史数据运行查询。运行查询时结合使用 run_daterun_time 参数,它们与计划查询中配置的日期相对应。

设置计划查询后,您可以根据以下说明,使用历史日期范围运行查询:

控制台

点击计划保存计划查询后,点击计划查询按钮可查看包含当前计划查询的列表。 点击任何显示名可查看查询计划的详细信息。在页面右上角,点击安排回填可指定历史日期范围。

“安排回填”按钮。

所选的运行时均在您选择的范围内(包括第一个日期,不包括最后一个日期)。

设置历史日期

示例 1

您设置了在 every day 09:00(太平洋时间)运行您的计划查询。但是您缺少了 1 月 1 日、1 月 2 日和 1 月 3 日的数据。选择以下历史日期范围:

Start Time = 1/1/19
End Time = 1/4/19

您的查询将使用与以下时间相对应的 run_daterun_time 参数运行:

  • 19/1/1 09:00 太平洋时间
  • 19/1/2 09:00 太平洋时间
  • 19/1/3 09:00 太平洋时间

示例 2

您设置了在 every day 23:00(太平洋时间)运行您的计划查询。但是您缺少了 1 月 1 日、1 月 2 日和 1 月 3 日的数据。选择以下历史日期范围(选择较晚的日期,是因为太平洋时间 23:00 已经是 UTC 的次日):

Start Time = 1/2/19
End Time = 1/5/19

您的查询将使用与以下时间相对应的 run_daterun_time 参数运行:

  • 19/1/2 06:00 UTC,或 2019/1/1 23:00 太平洋时间
  • 19/1/3 06:00 UTC,或 2019/1/2 23:00 太平洋时间
  • 19/1/4 06:00 UTC,或 2019/1/3 23:00 太平洋时间

设置手动运行后,刷新页面即可在运行列表中查看它们。

bq

如需在历史日期范围内手动运行查询,请执行以下操作:

输入 bq mk 命令并提供转移运行标志 --transfer_run。此外,还必须提供以下标志:

  • --start_time
  • --end_time
bq mk \
--transfer_run \
--start_time='start_time' \
--end_time='end_time' \
resource_name

替换以下内容:

  • start_timeend_time。 以 Z 结尾或包含有效时区偏移量的时间戳。示例:
    • 2017-08-19T12:11:35.00Z
    • 2017-05-25T00:00:00+00:00
  • resource_name。计划查询(或转移作业)的资源名称。资源名称也称为转移作业配置。

例如,以下命令会为计划查询资源(或转移作业配置)安排回填: projects/myproject/locations/us/transferConfigs/1234a123-1234-1a23-1be9-12ab3c456de7

  bq mk \
  --transfer_run \
  --start_time 2017-05-25T00:00:00Z \
  --end_time 2017-05-25T00:00:00Z \
  projects/myproject/locations/us/transferConfigs/1234a123-1234-1a23-1be9-12ab3c456de7

如需了解详情,请参阅 bq mk --transfer_run

API

使用 projects.locations.transferConfigs.scheduleRun 方法并提供 TransferConfig 资源的路径。

Java

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Java API 参考文档

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

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.ScheduleTransferRunsRequest;
import com.google.cloud.bigquery.datatransfer.v1.ScheduleTransferRunsResponse;
import com.google.protobuf.Timestamp;
import java.io.IOException;
import org.threeten.bp.Clock;
import org.threeten.bp.Instant;
import org.threeten.bp.temporal.ChronoUnit;

// Sample to run schedule back fill for transfer config
public class ScheduleBackFill {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String configId = "MY_CONFIG_ID";
    Clock clock = Clock.systemDefaultZone();
    Instant instant = clock.instant();
    Timestamp startTime =
        Timestamp.newBuilder()
            .setSeconds(instant.minus(5, ChronoUnit.DAYS).getEpochSecond())
            .setNanos(instant.minus(5, ChronoUnit.DAYS).getNano())
            .build();
    Timestamp endTime =
        Timestamp.newBuilder()
            .setSeconds(instant.minus(2, ChronoUnit.DAYS).getEpochSecond())
            .setNanos(instant.minus(2, ChronoUnit.DAYS).getNano())
            .build();
    scheduleBackFill(configId, startTime, endTime);
  }

  public static void scheduleBackFill(String configId, Timestamp startTime, Timestamp endTime)
      throws IOException {
    try (DataTransferServiceClient client = DataTransferServiceClient.create()) {
      ScheduleTransferRunsRequest request =
          ScheduleTransferRunsRequest.newBuilder()
              .setParent(configId)
              .setStartTime(startTime)
              .setEndTime(endTime)
              .build();
      ScheduleTransferRunsResponse response = client.scheduleTransferRuns(request);
      System.out.println("Schedule backfill run successfully :" + response.getRunsCount());
    } catch (ApiException ex) {
      System.out.print("Schedule backfill was not run." + ex.toString());
    }
  }
}

Python

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Python API 参考文档

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

import datetime

from google.cloud.bigquery_datatransfer_v1 import (
    DataTransferServiceClient,
    StartManualTransferRunsRequest,
)

# Create a client object
client = DataTransferServiceClient()

# Replace with your transfer configuration name
transfer_config_name = "projects/1234/locations/us/transferConfigs/abcd"
now = datetime.datetime.now(datetime.timezone.utc)
start_time = now - datetime.timedelta(days=5)
end_time = now - datetime.timedelta(days=2)

# Some data sources, such as scheduled_query only support daily run.
# Truncate start_time and end_time to midnight time (00:00AM UTC).
start_time = datetime.datetime(
    start_time.year, start_time.month, start_time.day, tzinfo=datetime.timezone.utc
)
end_time = datetime.datetime(
    end_time.year, end_time.month, end_time.day, tzinfo=datetime.timezone.utc
)

requested_time_range = StartManualTransferRunsRequest.TimeRange(
    start_time=start_time,
    end_time=end_time,
)

# Initialize request argument(s)
request = StartManualTransferRunsRequest(
    parent=transfer_config_name,
    requested_time_range=requested_time_range,
)

# Make the request
response = client.start_manual_transfer_runs(request=request)

# Handle the response
print("Started manual transfer runs:")
for run in response.runs:
    print(f"backfill: {run.run_time} run: {run.name}")

删除计划查询

控制台

如需通过控制台删除计划查询,请执行以下操作:

  1. 在导航窗格中,点击计划查询

  2. 在计划查询列表中,点击要删除的计划查询的名称。

  3. 在打开的计划查询详细信息页面上,点击删除更新计划查询凭据。

Java

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Java API 参考文档

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

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.DeleteTransferConfigRequest;
import java.io.IOException;

// Sample to delete a transfer config
public class DeleteTransferConfig {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    // i.e projects/{project_id}/transferConfigs/{config_id}` or
    // `projects/{project_id}/locations/{location_id}/transferConfigs/{config_id}`
    String configId = "MY_CONFIG_ID";
    deleteTransferConfig(configId);
  }

  public static void deleteTransferConfig(String configId) throws IOException {
    try (DataTransferServiceClient dataTransferServiceClient = DataTransferServiceClient.create()) {
      DeleteTransferConfigRequest request =
          DeleteTransferConfigRequest.newBuilder().setName(configId).build();
      dataTransferServiceClient.deleteTransferConfig(request);
      System.out.println("Transfer config deleted successfully");
    } catch (ApiException ex) {
      System.out.println("Transfer config was not deleted." + ex.toString());
    }
  }
}

Python

如需了解如何安装和使用 BigQuery 客户端库,请参阅 BigQuery 客户端库。如需了解详情,请参阅 BigQuery Python API 参考文档

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

import google.api_core.exceptions
from google.cloud import bigquery_datatransfer

transfer_client = bigquery_datatransfer.DataTransferServiceClient()

transfer_config_name = "projects/1234/locations/us/transferConfigs/abcd"
try:
    transfer_client.delete_transfer_config(name=transfer_config_name)
except google.api_core.exceptions.NotFound:
    print("Transfer config not found.")
else:
    print(f"Deleted transfer config: {transfer_config_name}")

配额

计划查询使用创建者的凭据和项目来执行,就像您自己在执行查询一样。 计划查询始终作为批量查询作业运行。

虽然计划查询使用 BigQuery Data Transfer Service 的功能,但它们不是转移作业,并且不受加载作业配额的约束。计划查询与手动查询受相同的 BigQuery 配额和限制约束。

价格

计划查询与手动 BigQuery 查询的价格相同。

支持的区域

以下位置支持计划查询。

区域

下表列出了可使用 BigQuery 的美洲区域。
区域说明 区域名称 详细信息
俄亥俄州,哥伦布 us-east5
达拉斯 us-south1
爱荷华 us-central1 叶形图标 二氧化碳排放量低
拉斯维加斯 us-west4
洛杉矶 us-west2
蒙特利尔 northamerica-northeast1 叶形图标 二氧化碳排放量低
北弗吉尼亚 us-east4
俄勒冈 us-west1 叶形图标 二氧化碳排放量低
盐湖城 us-west3
圣保罗 southamerica-east1 叶形图标 二氧化碳排放量低
圣地亚哥 southamerica-west1 叶形图标 二氧化碳排放量低
南卡罗来纳 us-east1
多伦多 northamerica-northeast2 叶形图标 二氧化碳排放量低
下表列出了可使用 BigQuery 的亚太区域。
区域说明 区域名称 详细信息
德里 asia-south2
香港 asia-east2
雅加达 asia-southeast2
墨尔本 australia-southeast2
孟买 asia-south1
大阪 asia-northeast2
首尔 asia-northeast3
新加坡 asia-southeast1
悉尼 australia-southeast1
台湾 asia-east1
东京 asia-northeast1
下表列出了可使用 BigQuery 的欧洲区域。
区域说明 区域名称 详细信息
比利时 europe-west1 叶形图标 二氧化碳排放量低
柏林 europe-west10
芬兰 europe-north1 叶形图标 二氧化碳排放量低
法兰克福 europe-west3 叶形图标 二氧化碳排放量低
伦敦 europe-west2 叶形图标 二氧化碳排放量低
马德里 europe-southwest1
米兰 europe-west8
荷兰 europe-west4
巴黎 europe-west9 叶形图标 二氧化碳排放量低
都灵 europe-west12
华沙 europe-central2
苏黎世 europe-west6 叶形图标 二氧化碳排放量低
下表列出了提供 Dataflow 的中东区域。
区域说明 区域名称 详细信息
达曼 me-central2
多哈 me-central1
特拉维夫 me-west1
下表列出了可使用 BigQuery 的非洲区域。
区域说明 区域名称 详细信息
约翰内斯堡 africa-south1

多区域

下表列出了可使用 BigQuery 的多区域。
多区域说明 多区域名称
欧盟成员国的数据中心1 EU
美国的数据中心 US

1 位于 EU 多区域的数据仅存储在 europe-west1(比利时)或 europe-west4(荷兰)数据中心中。

后续步骤