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

时间:2017-08-19 15:51:18

标签: python google-bigquery google-python-api

我一直在使用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。基本上我正在ids中收集这些作业queue,并希望稍后检查job是否处于DONE状态。我怎么能这样做?

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

1 个答案:

答案 0 :(得分:2)

您可以根据name属性过滤掉您想要的工作。

让我们假设您希望获得有关id是"大名字字符串作业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

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

[编辑]:

你在评论中说过有100万个工作。就运行get job方法而言,目前API仅在运行existsreload方法时才这样做,因此无法运行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存储库的一个有趣的功能请求。