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 插入大量数据

使用 python 和 BigQuery API 获取 BigQuery 数据集中的表列表

使用 python 的 BigQuery 外部表

是否已更改Python BigQuery API?

使用 Python 将 Pub/Sub 消息加载到 BigQuery