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

标签 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)

正如你在代码中看到的,我正在做的是:

-create table with batch id
-drop old table.(this gets executed first stopping any further steps.)
-recreate new table without batch id
-drop table from step 1.

最佳答案

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

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

...

关于python - 如何避免在大查询中创建表之前运行删除表查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53369701/

相关文章:

python - 如何将 Tensorflow Simple Audio Recognition frozen graph(.pb) 转换为 Core ML 模型?

python - 为什么我的元组列表是垂直的?

Python:如何重复输入错误之前的最后一个输入提示?

sql - 如何获取给定时间段内的最小值

google-bigquery - 使用 Bigquery 将逗号分隔的字符串拆分为行

python - Twitter API - 如何获取用户的实时推文

python - 将类似功能应用于多级 Pandas 数据框

google-bigquery - 如何在 Google 大查询中的时间分区表中添加新列

json - Firebase 数据到 Google BigQuery

sql - 如何计算同一列中不同类别的日期之间的差异?