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

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

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

view = bq_client.create_table(view)

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

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

1 Ответ

1 голос
/ 31 марта 2020

Если вы хотите перезаписать существующую таблицу, вы можете использовать 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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...