如何查询在 bigquery 操作中提交的特定作业 ID

Posted

技术标签:

【中文标题】如何查询在 bigquery 操作中提交的特定作业 ID【英文标题】:How to query a particular job id submitted in bigquery action 【发布时间】:2017-08-19 15:51:17 【问题描述】:

我一直在使用google_cloudbig query 提交作业以将文件提取到GCS,如下所示:

dataset = self.bqClient.dataset(self.website_id)
table = dataset.table(table_name)
job_name = str(uuid.uuid4())
job = self.bqClient.extract_table_to_storage(
job_name, table, destination)
job.destination_format = "NEWLINE_DELIMITED_JSON"
job.compression = 'GZIP'
job.begin()

这里的工作idnameuuid4。基本上我在queue 中收集这些工作ids 并想稍后检查job 是否处于DONE 状态。我该怎么做?

我一直在寻找这个,但到目前为止还没有运气。我只能找到函数 - client.list_jobs(),但它是所有 jobs 的列表。对于一个特定的job,我只想querysearch

【问题讨论】:

【参考方案1】:

您可以通过name 属性过滤出您想要的工作。

假设您想要获取有关其id 是“big name string job 1”的作业的信息。您可以通过运行将其从作业列表中过滤掉:

job_name = "big name string job 1"
job = [job for job in list(self.bqClient.list_jobs()) if job.name == job_name][0] # this will break if list is empty

print(job.state) # DONE or RUNNING

如果可能,请确保更新客户端,目前我们是 ate 版本0.26.0

[编辑]:

您在评论中提到拥有 100 万个工作岗位。至于运行get job 方法,目前API 仅在运行exists 和reload 方法时才会这样做,因此无法运行client.get_job(job_name) 之类的方法。

不过,在list_job 中,您可以像在code 中一样发送参数all_usersstate_filter,类似于:

job_name = "big name string job 1"
job = [job for job in list(self.bqClient.list_jobs(all_users=False, state_filter='done')) if job.name == job_name][0]

仅列出在给定状态的客户端中授权的当前用户的作业。

如果这仍然列出数百万,那么您仍然可以(有点“hacky”的解决方案)直接从作业基础构造函数查询它,例如:

from google.cloud.bigquery.job import _AsyncJob
job = _AsyncJob(job_name, self.bqClient)
job.reload()
print(job.state) #RUNNING or DONE

这是运行client.get_job() 的间接方式。

这可能是对 python 存储库的一个有趣的功能请求。

【讨论】:

让我们如果有 100 万个工作那么也有这个选项? @NikhilParmar 我用新信息编辑了我的答案 非常感谢!让我试试看,让你知道

以上是关于如何查询在 bigquery 操作中提交的特定作业 ID的主要内容,如果未能解决你的问题,请参考以下文章

Google BigQuery:授予服务帐户权限以仅在某些特定数据集中创建作业

如何在Google BigQuery Composer和Cloud Shell中提交多个查询

如何停止长时间运行的 BigQuery 作业?

如何获取在 BigQuery 命令行工具中运行的最后一个作业的作业 ID?

BigQuery 中的查询作业中的 allowLargeResults

如何将完成的 BigQuery 作业导出为 CSV