使用Python SDK创建BigQuery带脚本定时查询的报错问题
解决方案
该报错的本质是两个参数的耦合校验逻辑:当定时查询使用多语句脚本(含变量声明、MERGE等非单纯SELECT语句)时不需要指定目标数据集,但原代码使用的项目级父路径未携带区域信息,导致传空destination_dataset_id时SDK校验不通过。
修改后可直接运行的代码
from google.cloud import bigquery_datatransfer transfer_client = bigquery_datatransfer.DataTransferServiceClient() def create_scheduled_query(dataset_region, project, name, schedule, service_account, query): # 关键修改1:使用带区域的父路径,替代原项目级路径 parent = transfer_client.common_location_path(project, dataset_region) transfer_config = bigquery_datatransfer.TransferConfig( # 关键修改2:目标数据集传空字符串即可 destination_dataset_id="", display_name=name, data_source_id="scheduled_query", params={ "query": query }, schedule=schedule, ) transfer_config = transfer_client.create_transfer_config( bigquery_datatransfer.CreateTransferConfigRequest( parent=parent, transfer_config=transfer_config, service_account_name=service_account, ) ) print("Created scheduled query '{}'".format(transfer_config.name))
修改说明
- 原代码用
common_project_path构造的父路径仅包含项目ID,SDK规则要求如果不指定目标数据集,必须在父路径中明确指定区域,因此替换为common_location_path,传入脚本操作的数据集所在的区域(比如us、eu、asia-east1等,和GUI创建时选择的区域保持一致即可) - 此时
destination_dataset_id传空字符串不会触发校验错误,创建出的定时查询配置和GUI生成的完全一致,带多语句、MERGE的脚本可以正常运行 - 建议查询脚本中所有操作的表都写全路径
项目ID.数据集ID.表ID,避免区域/项目匹配问题
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

