2017-07-03 90 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的問題那樣,那麼就沒有辦法獲得或取消工作的結果。 –