使用python在Google BigQuery中进行多个UPDATE查询

时间:2019-04-15 21:14:25

标签: python google-bigquery

我正在尝试通过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命令,它可以工作,但是有点慢。任何有关如何以更有效的方式进行操作的提示或技巧,将不胜感激。

4 个答案:

答案 0 :(得分:2)

BigQuery使用异步作业进行查询。这意味着您可以提交查询,但查询尚未完成。如果下一次更新需要完成上一个更新,则可以等待它完成。

如果它们之间没有紧密结合,只需发送所有更新,然后等待最后,所有更新都应完成。查询的返回对象就是该作业,因此您可以使用它来检查任何更新命令的状态。

More info

答案 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()