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



我正在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的表
-删除旧表。(这将首先执行,停止任何进一步的步骤。(
-在没有批处理id的情况下重新创建新表
-从步骤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()
...

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

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

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

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

最新更新