代码之家  ›  专栏  ›  技术社区  ›  Meghdeep Ray

删除成功后BigQuery作业仍处于运行状态

  •  0
  • Meghdeep Ray  · 技术社区  · 8 年前

    我使用下面的Python代码从BigQuery中的一个表中删除所有数据,当我在运行代码几秒钟后检查该表时,发现该表现在是空的,因此删除必须成功。但是,作业状态仍然显示它处于运行状态。

    from google.cloud import bigquery
    import time
    
    client     = bigquery.Client()
    job_config = bigquery.QueryJobConfig()
    
    job_config.priority = bigquery.QueryPriority.INTERACTIVE
    
    sql = """DELETE FROM <table_name> WHERE TRUE"""
    
    query_job = client.query( sql, job_config= job_config )
    query_job = client.get_job( query_job.job_id )  # API request - fetches job
    
    while query_job.state == "RUNNING":
        print( "Job {} is currently in state {}".format( query_job.job_id, query_job.state ) )
        time.sleep( 5 )
    
    if query_job.errors != None:
        print( "Query Failed." )
        raise Exception( "Query Failed. Error: [ %s ]." % query_job.error_result )
    

    这里出什么事了?为什么工作没有进行到完成状态?如何通过代码检查是否成功执行?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Elliott Brossard    8 年前

    诀窍就在这里:

    query_job = client.get_job( query_job.job_id )  # API request - fetches job
    
    while query_job.state == "RUNNING":
        print( "Job {} is currently in state {}".format( query_job.job_id, query_job.state ) )
        time.sleep( 5 )
    

    get_job 返回作业在某个时间点的状态,但在作业状态更改时不会自动更新。相反,你需要打电话 找工作 作为循环的一部分:

    while True:
      query_job = client.get_job( query_job.job_id )  # API request - fetches job
      if query_job.state != "RUNNING":
        break
      print( "Job {} is currently in state {}".format( query_job.job_id, query_job.state ) )
      time.sleep( 5 )