我想使用 bash 脚本在 BigQuery 中制作一次性数据集复制,从source_dataset_A到target_dataset_B
这个操作在BigQuery Console中很容易完成,就像这样

但是,如果我bq mk --transfer_config像下面那样使用,它将创建一个具有定期计划(“每 24 小时”)的数据集复制传输作业。
bq mk --transfer_config --project_id=data-project --data_source=cross_region_copy \
--display_name='one-time-dataset-copy' \
--target_dataset=target_dataset_B \
--params='{"source_dataset_id":"source_dataset_A","source_project_id":"source_project","overwrite_destination_table":"true"}' \
Run Code Online (Sandbox Code Playgroud)
如何在 BigQuery 中进行一次性数据集复制?
我花了一段时间才弄清楚如何做到这一点,但需要的是正确设置三个schedule标志bq。
--schedule:数据传输时间表。如果数据源不支持自定义计划,则该字段应为空。如果为空,则将使用数据源的默认值。指定时间采用 UTC 时间。有效格式示例:每月的第一个、第三个星期一 15:30,一月、六月的每周三、星期五 13:15,以及季度的第一个星期日 00:00。
--schedule_end_time:停止给定传输配置调度传输运行的时间。如果为空,则结束时间的默认值将用于无限期地安排运行。时间戳的格式为 RFC3339 UTC“Zulu”。
--schedule_start_time:为给定传输配置开始调度传输运行的时间。如果为空,则将使用开始时间的默认值立即开始运行。时间戳的格式为 RFC3339 UTC“Zulu”。
要制作一次性副本,您需要设置具有正确开始和结束时间的计划,使其仅运行一次。
所以你可以这样做
bq mk --transfer_config --project_id=data-project --data_source=cross_region_copy \
--display_name='one-time-dataset-copy' \
--target_dataset=target_dataset \
--params='{"source_dataset_id":"source_dataset","source_project_id":"source_project","overwrite_destination_table":"true"}' \
--schedule_end_time=$(date -u -d '5 mins' +%Y-%m-%dT%H:%M:%SZ)
Run Code Online (Sandbox Code Playgroud)
这意味着每 24 小时(默认)设置一个数据集复制传输作业--schedule,计划立即开始--schedule_start_time default,计划从现在开始 5 分钟后结束 ( --schedule_end_time)。通过这样做,传输作业将仅触发一次且仅一次运行。