Может ли API BigQuery перезаписать существующую таблицу/представление с помощью create_table() (вставка таблиц)?

Я использую функция create_table() клиента Python, которая вызывает базовую API вставки таблиц. Существует параметр exists_ok, но это заставляет функцию просто игнорировать создание, если таблица уже существует. Проблема в том, что при создании представления я хотел бы перезаписать существующий SQL представления, если он уже существует. Что я сейчас делаю, чтобы обойти это:

if overwrite:
    bq_client.delete_table(view, not_found_ok=True)

view = bq_client.create_table(view)

Что мне не нравится в этом, так это то, что потенциально есть несколько секунд, в течение которых представление больше не существует. И если код умирает по какой-либо причине после удаления, но до создания, то представление фактически исчезает.

Мой вопрос: есть ли способ создать таблицу (представление) таким образом, чтобы она перезаписывала любой существующий объект? Или, возможно, мне нужно обнаружить эту ситуацию и запустить какой-то update_table() (патч)?


person Neil C. Obremski    schedule 31.03.2020    source источник


Ответы (1)


Если вы хотите перезаписать существующую таблицу, вы можете использовать класс google.cloud.bigquery.job.WriteDisposition, см. официальная документация.

Здесь у вас есть три возможности: WRITE_APPEND, WRITE_EMPTY и WRITE_TRUNCATE. То, что вы должны использовать, это WRITE_TRUNCATE, которое перезаписывает данные таблицы.

Вы можете увидеть следующий пример здесь:

from google.cloud import bigquery
import pandas

client = bigquery.Client()

table_id = "<YOUR_PROJECT>.<YOUR_DATASET>.<YOUR_TABLE_NAME>"

records = [
    {"artist": u"Michael Jackson", "birth_year": 1958},
    {"artist": u"Madonna", "birth_year": 1958},
    {"artist": u"Shakira", "birth_year": 1977},
    {"artist": u"Taylor Swift", "birth_year": 1989},
]
dataframe = pandas.DataFrame(
    records,
    columns=["artist", "birth_year"],
    index=pandas.Index(
        [u"Q2831", u"Q1744", u"Q34424", u"Q26876"], name="wikidata_id"
    ),
)
job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField("artist", bigquery.enums.SqlTypeNames.STRING),
        bigquery.SchemaField("wikidata_id", bigquery.enums.SqlTypeNames.STRING),
    ],
    write_disposition="WRITE_TRUNCATE",
)

job = client.load_table_from_dataframe(
    dataframe, table_id, job_config=job_config
)
job.result()

table = client.get_table(table_id)

Дайте мне знать, если это соответствует вашим потребностям. Я надеюсь, что это помогает.

ОБНОВЛЕНО:

Вы можете использовать следующий код Python для обновления представления таблицы с помощью клиентской библиотеки:

client = bigquery.Client(project="projectName")
table_ref = client.dataset('datasetName').table('tableViewName')
table = client.get_table(table_ref)
table.view_query = "SELECT * FROM `projectName.dataset.sourceTableName`"
table = client.update_table(table, ['view_query'])
person Ines    schedule 31.03.2020
comment
расположение записи является частью создания задания загрузки для создания таблицы. Я специально спрашиваю о команде API, которая создает таблицу (поскольку я использую ее для создания представления). - person Neil C. Obremski; 31.03.2020
comment
Я обновил свой вопрос, обновив код просмотра. Также вы можете посмотреть здесь - person Ines; 07.04.2020