我正在尝试通过python API运行多个BigQuery查询,但似乎并非所有查询都已完成,我想我没有给他们足够的时间来完成它们。我拥有的是这样的:
from google.cloud import bigquery
client = bigquery.Client()
query1 = "UPDATE ..."
client.query(query1)
query2 = "UPDATE ..."
client.query(query2)
query3 = "UPDATE ..."
client.query(query3)
到目前为止,我的解决方案是在每个客户端调用之前插入一个sleep命令,它可以工作,但是有点慢。任何有关如何以更有效的方式进行操作的提示或技巧,将不胜感激。
答案 0 :(得分:2)
BigQuery使用异步作业进行查询。这意味着您可以提交查询,但查询尚未完成。如果下一次更新需要完成上一个更新,则可以等待它完成。
如果它们之间没有紧密结合,只需发送所有更新,然后等待最后,所有更新都应完成。查询的返回对象就是该作业,因此您可以使用它来检查任何更新命令的状态。
答案 1 :(得分:1)
如果将作业返回到变量,则可以使用job.state或job.error_result确定作业是否完成。然后您可以执行以下操作:
j = client.query(query1)
while j.state == 'RUNNING':
time.sleep(10)
if j.error_result is not None:
print(j.error_result)
break
也可以使用“;”一个接一个地运行查询
e.g. query1 = "select * from table1; select * from table2"
答案 2 :(得分:1)
现在,BigQuery脚本已发布,您可以简单地将所有UPDATE作为脚本运行:
from google.cloud import bigquery
client = bigquery.Client()
query1 = "UPDATE ..."
query1 += "UPDATE ..."
query1 += "UPDATE ..."
client.query(query1)
答案 3 :(得分:1)
如果仅插入query_job.result()
,它将等待查询执行。
from google.cloud import bigquery
client = bigquery.Client()
query1 = "UPDATE ..."
query_job = client.query(query1)
query_job.result()
query2 = "UPDATE ..."
query_job = client.query(query2)
query_job.result()
query3 = "UPDATE ..."
query_job = client.query(query3)
query_job.result()
我个人想写得更紧凑
from google.cloud import bigquery
client = bigquery.Client()
queries = ["UPDATE ...", "UPDATE ...", "UPDATE ..."]
for query in queries:
query_job = client.query(query)
query_job.result()