【问题标题】:How to avoid running drop table query before create table in big query?如何避免在大查询中创建表之前运行删除表查询?
【发布时间】:2018-11-19 06:57:20
【问题描述】:

我正在使用 python 开发一个自动大查询数据摄取管道。我正在使用 python API 创建 SQL 字符串并执行它们以创建大查询表并将新数据附加到旧表。

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

有没有办法可以在创建表查询之前停止删除表查询以执行?下面是我正在使用的代码的 sn-ps。

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 旧表。(首先执行此操作,停止任何进一步的步骤。)
- 重新创建没有批次 ID 的新表
- 从步骤 1 中删除表。

【问题讨论】:

    标签: python google-bigquery


    【解决方案1】:

    尝试按正确的时间睡眠是个坏主意,因为您不知道任何特定操作需要多长时间。移除对睡眠的调用,而是在启动每个查询后等待结果:

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

    【讨论】:

      【解决方案2】:

      为什么不对表格进行原子替换?

      CREATE OR REPLACE TABLE `deleting.mytable`
      AS
      # SELECT 1 x
      SELECT x+x x 
      FROM `deleting.mytable`
      

      【讨论】:

      • 我刚开始使用 GCP,脚本很旧,我一定会寻找优化的方法,并将此提示牢记在心。谢谢!
      【解决方案3】:

      我了解到,如果您要更改/添加 PARTITION 或 CLUSTER by 子句,CREATE OR REPLACE 将起作用。相反,您必须使用类似的东西

      drop table if exists dataset.some_table;
      create table if not exists dataset.some_table (
      ...
      )
      partition by ...
      cluster by ..;
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 2019-07-20
      相关资源
      最近更新 更多