2017-07-03 21 views
0

我编写了一个运行某个SELECT查询异步的python脚本。运行该脚本后的第一时间,它总是错误出来后,出现以下错误:bigquery python client.run_async_query给出错误:409已经存在

google.cloud.exceptions.Conflict: 409 Already Exists: Job ps-bigdata:vci-temp-sales-query-job (POST https://www.googleapis.com/bigquery/v2/projects/ps-bigdata/jobs)

下面的代码片段:

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失败() “线。我不知道在会议结束或工作执行之后,有名的工作会继续存在。如何检查已命名作业是否已存在,如果存在,如何删除现有命名作业以创建新作业?或者我必须在任何时候创建随机或独特的作业名称,我运行一个异步作业?

+0

你可以用'job.exists()'检查一个作业是否存在。如果它存在,那么你可以用'job.cancel()'来取消它。你可能想在取消之前检查'job.ended'。 – Abdou

回答

2

您需要使用唯一的作业ID,因为这是与操作的元数据关联的内容。参考querying data example,你的代码可能是这样的:

job_name = 'vci-temp-sales-query-job_{}'.format(uuid.uuid4()) 
+0

我刚刚在某处的代码片段中找到了答案。谢谢!。传递给client.run_async_query()方法的作业ID必须是唯一的。因此,添加“导入uuid”和“uuid.uuid4()”以获得唯一的ID是最佳选择。 –

+0

是否有一个特定的原因,为什么BigQuery被设计为每次都需要一个唯一的Job ID? – user4279562

+0

您可以使用此ID与作业进行交互或检索有关作业的信息。如果有一个具有相同ID的活跃工作,就像OP的问题那样,那么就没有办法获得或取消工作的结果。 –

相关问题