如何在BigQuery API v0.27中指定数据集位置以解决404报错
BigQuery Python客户端v0.27指定查询区域解决方案
问题根因
BigQuery Python客户端v0.27版本中,直接为Client实例赋值location属性不会对异步查询作业生效,作业运行区域需要在调用run_async_query方法时显式传入。即使SQL语句中写了完整的表路径,接口也不会自动解析路径匹配数据集区域,必须显式指定作业运行区域与数据集区域一致,否则会返回404错误。
代码修改示例
你之前写的_get_client方法可以保留,只需要在调用run_async_query的位置新增location入参即可,示例如下:
def _get_client(self): bigquery.Client.SCOPE = ( 'https://www.googleapis.com/auth/bigquery', 'https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/drive') client = bigquery.Client.from_service_account_json(_KEY_FILE) if self._params['bq_data_location'].strip(): client.location = self._params['bq_data_location'] return client def execute_bq_query(self, query_sql): client = self._get_client() # 核心修改:调用run_async_query时传入location参数 query_job = client.run_async_query( job_name="your-custom-job-id", # 替换为自定义的作业唯一标识 query=query_sql, location=client.location # 直接读取client实例中已配置的location值 ) # 其余原有查询配置保持不变 query_job.use_legacy_sql = False # 提交作业 query_job.begin() # 后续作业状态查询、结果读取逻辑无需修改 return query_job
注意事项
- 传入的区域值必须和数据集创建时选择的区域标识完全一致,本场景下为
northamerica-northeast1 - 若查询涉及多个数据集,所有数据集必须存储在同一个区域,作业运行区域指定为该区域即可
内容的提问来源于stack exchange,提问作者T.S.
相关产品推荐
相关产品推荐

