Може ли BigQuery API да презапише съществуваща таблица/изглед с 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