如何避免在大查询中创建表之前运行删除表查询?

时间:2018-11-19 06:57:21

标签: python google-bigquery

我正在使用python进行自动化的大查询数据提取管道。我正在使用python API创建SQL字符串并执行它们以创建大型查询表,并将新数据追加到旧表中。

我在代码中有一节,它从旧表创建一个新表。之后,它将删除旧表。但是有时我遇到一个问题,即在创建表查询之前执行删除表查询。为了克服这个问题,我在脚本中手动设置了 time.sleep()

是否可以在创建表查询之前停止放置表查询以执行?以下是我正在使用的代码段。

Fnl_DtaNme_Bth = Final_DataName + datetime.now().strftime('%Y%m%d_%H%M%S')

    fnl_sql_vw = """
        Create table {} as
            (
            select * from `{}` where row_key not in (select row_key from `{}`)
            union all
            select {} from `{}` 
            )
    """.format(dataset_id + '.' + Fnl_DtaNme_Bth, ProjectID + '.' + dataset_id + '.' + Final_DataName, ProjectID + '.' + dataset_id + '.' + viewname, List_COls, ProjectID + '.' + dataset_id + '.' + viewname)

    print('CreateTable:-->', fnl_sql_vw)

    client = bigquery.Client()
    query_job = client.query(fnl_sql_vw)

    time.sleep(10)

#########       Here we are DROPING Old Mater Data      ##############      
    drop_table = """Drop Table `{}`""".format(ProjectID + '.' + dataset_id + '.' + Final_DataName)

    client = bigquery.Client()
    query_job = client.query(drop_table)
    time.sleep(10)

#########Here we are RE-CREATING Mater Data without BATCH_ID#############       
    fnl_data = """Create table {} as Select * from `{}`""".format( dataset_id + '.' + Final_DataName, ProjectID + '.' + dataset_id + '.' + Fnl_DtaNme_Bth) #args.dataset_id + '.' + Destination_Table
    client = bigquery.Client()
    query_job = client.query(fnl_data)
    time.sleep(10)

 #########Here we are DROPING Mater Data with BATCH_ID ############ #           
    drop_table_old = """
        Drop Table `{}`
    """.format(ProjectID + '.' + dataset_id + '.' + Fnl_DtaNme_Bth)

    client = bigquery.Client()
    query_job = client.query(drop_table_old)

您可以在代码中看到,我正在做的是:

  

-创建具有批次ID的表
  -drop old table。(首先停止所有后续步骤。)
  -重新创建没有批次ID的新表
  步骤1中删除表格。

2 个答案:

答案 0 :(得分:2)

尝试睡眠正确的时间是一个坏主意,因为您不知道任何特定的操作将花费多长时间。取消休眠的调用,而是在启动每个查询后等待结果:

query_job = client.query(fnl_sql_vw)
# Wait for completion
query_job.result()

drop_table = """Drop Table `{}`""".format(ProjectID + '.' + dataset_id + '.' + Final_DataName)
query_job = client.query(drop_table)
# Wait for completion
query_job.result()

...

答案 1 :(得分:1)

为什么不原子替换表?

Serial.print("cuenta q2: ");
Serial.print( cuenta_pulsos_encoder_1,3);
Serial.print("\t");
Serial.print(q2_real,4);
Serial.print("\t");
Serial.print("cuenta q3: ");
Serial.print( cuenta_pulsos_encoder_2,3);
Serial.print("\t");
Serial.print(q3_real,4);
Serial.print("\t");
Serial.print("cuenta q4: ");
Serial.print( cuenta_pulsos_encoder_3,3);
Serial.print("\t");
Serial.println(q4_real,4);