Изменить определение представления bigquery с помощью Python

Я пытаюсь обновить представление в bigquery через python. Мне удалось создать представление, используя следующий подход;

def createView(client):
    viewDataset = 'dataset'
    viewName = 'name'
    view_ref = client.dataset(viewDataset).table(viewName)
    view = bigquery.Table(view_ref)
    view_sql = """
    select * from '{}.{}' where thing = 2
    """".format(viewDataSet, viewName)
    view.view_query = view_sql
    client.create_table(view)

(Код для объяснения)

Это сработало нормально и создало представление. Затем я хотел запустить функцию, которая обновляет определение представления. Я повторно использовал тот же код, и он не удался из-за ошибки, говорящей, что представление уже существует - это имеет смысл. Затем я последовал этому примеру здесь; https://cloud.google.com/bigquery/docs/managing-views

Использование кода для обновления SQL-запроса представлений. В основном я поменял строчку

client.create_table(view)

для

client.update_table(view)

Я получаю сообщение об ошибке, в котором говорится, что я не добавил атрибут fields ... Поскольку я представляю, мне бы не пришлось этого делать.

Может ли кто-нибудь сказать мне, как правильно использовать python для обновления существующего представления bigquery?

Ваше здоровье


person keeweem    schedule 16.09.2018    source источник
comment
В документации используется update_table для изменения атрибутов представления. Где ты видишь update_view?   -  person Elliott Brossard    schedule 16.09.2018
comment
Да. Я использовал функцию update_table и получил ошибку о полях.   -  person keeweem    schedule 17.09.2018
comment
В качестве альтернативы вы можете просто использовать инструкцию CREATE OR REPLACE VIEW, если у вас возникли проблемы с API.   -  person Elliott Brossard    schedule 17.09.2018
comment
Можно ли запустить оператор ddl с Python? Если так, то это решит многие мои проблемы.   -  person keeweem    schedule 17.09.2018
comment
Просто запустите его, как любой другой запрос.   -  person Elliott Brossard    schedule 17.09.2018


Ответы (1)


Смотреть! Ты используешь:

"select * from '{}.{}' where thing = 2"

Обратите внимание на это:

from '{}.{}'

Но на таблицу следует ссылаться как:

from '{}.{}.{}'

Мне подходит этот фрагмент кода:

from google.cloud import bigquery

if __name__ == "__main__":
    client = bigquery.Client()

    dataset_view_id= 'dataset_name'
    table_view_id = 'view_name'

    view = bigquery.Table(client.dataset(dataset_view_id).table(table_view_id))


    ##############        
    ###what was in that table? request table info
    ##############
    get_view = client.get_table(view)  # API Request

    # Display OLD view properties
    print('View at {}'.format(get_view.full_table_id))
    print('View Query:\n{}'.format(get_view.view_query))


    ##############
    #update the table:
    ##############
    sql_template = (
        'SELECT * FROM `{}.{}.{}` where disease="POLIO" ')

    source_project_id = "project_from_the_query"
    source_dataset_id = "dataset_from_the_query"
    source_table_id = "table_from_the_query"

    view.view_query = sql_template.format(source_project_id, source_dataset_id, source_table_id)

    view = client.update_table(view, ['view_query'])  # API request


    ##############
    #Now print the view query to be sure it's been updated:
    ##############    
    get_view = client.get_table(view)  # API Request

    # Display view properties
    print('\n\n NEW View at {}'.format(get_view.full_table_id))
    print('View Query:\n{}'.format(get_view.view_query))
    # [END bigquery_get_view]
person Temu    schedule 26.10.2018
comment
это здорово, я нашел обходной путь, но это более элегантно, спасибо! - person keeweem; 28.10.2018