bigquery python client.run_async_query 给出错误:409 已经存在
Posted
技术标签:
【中文标题】bigquery python client.run_async_query 给出错误:409 已经存在【英文标题】:bigquery python client.run_async_query gives error: 409 Already Exists 【发布时间】:2017-07-03 22:08:39 【问题描述】:我正在编写一个运行某个 SELECT 查询异步的 Python 脚本。第一次运行脚本后,总是出错,并出现以下错误:
google.cloud.exceptions.Conflict:409 已存在:作业 ps-bigdata:vci-temp-sales-query-job (POST https://www.googleapis.com/bigquery/v2/projects/ps-bigdata/jobs)
这是一个代码sn-p:
from google.cloud import bigquery
google_auth_json_file = './myprojectauth.json'
client = bigquery.Client.from_service_account_json( google_auth_json_file )
project = 'myProject'
dataset = 'myDataset'
ds = client.dataset(dataset)
query = "SELECT X,y,z FROM mytable;"
#--- Clear/create temp table
temp_table_name = 'myTempTable'
temp_tbl = myCreateTempTableFunction( client, project, dataset, temp_table_name )
#--- Create an async query job
job_name = 'vci-temp-sales-query-job'
job = client.run_async_query(job_name, query)
job.destination = temp_tbl
job.write_disposition = 'WRITE_TRUNCATE'
job.begin()
此脚本在“job.begin()”行失败。我不知道命名作业会在会话结束或作业执行之后继续存在。如何检查命名作业是否已存在,如果存在,如何删除现有的命名作业以创建新作业?还是每次运行异步作业时都必须创建随机或唯一的作业名称?
【问题讨论】:
您可以使用job.exists()
检查作业是否存在。如果它存在,那么您可以使用job.cancel()
取消它。您可能需要在取消之前检查job.ended
。
【参考方案1】:
您需要使用唯一的作业 ID,因为这是与操作的元数据相关联的内容。参考querying data example,您的代码可能是这样的:
job_name = 'vci-temp-sales-query-job_'.format(uuid.uuid4())
【讨论】:
我刚刚在某处的示例代码 sn-p 中找到了答案。谢谢!。传递给 client.run_async_query() 方法的作业 ID 必须是唯一的。因此,添加“import uuid”和“uuid.uuid4()”以获得唯一ID是最好的选择。 BigQuery 每次都采用唯一的作业 ID 有什么具体原因吗? 您可以使用此 ID 与作业交互或检索有关作业的信息。如果有一个具有相同 ID 的有效工作,就像 OP 的问题一样,那么就没有办法,例如获取或取消作业的结果。以上是关于bigquery python client.run_async_query 给出错误:409 已经存在的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery,Python 批量插入 bigquery 以进行流式传输服务(“告诉”错误)
通过 bigquery-python 库向 BigQuery 插入大量数据