Как избежать выполнения запроса удаления таблицы перед созданием таблицы в большом запросе? - PullRequest
0 голосов
/ 19 ноября 2018

Я работаю над автоматизированным конвейером приема больших данных в 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)

Как вы можете видеть из кода, я делаю следующее:

- создаем таблицу с идентификатором пакета
- удаляем старую таблицу. (он выполняется первым, останавливая все дальнейшие шаги.)
-создание новой таблицы без идентификатора пакета
-падение таблицы с шага 1.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Почему бы не сделать атомную замену таблицы?

CREATE OR REPLACE TABLE `deleting.mytable`
AS
# SELECT 1 x
SELECT x+x x 
FROM `deleting.mytable`
0 голосов
/ 19 ноября 2018

Попытка спать в течение правильного количества времени - плохая идея, так как вы не знаете, сколько времени займет какая-то конкретная операция. Удалите вызовы в спящий режим и вместо этого дождитесь результатов после запуска каждого запроса:

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

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...