BigQuery-проверить, существует ли таблица
У меня есть набор данных в BigQuery. Этот набор данных содержит несколько таблиц.
Я делаю следующие шаги программно, используя BigQuery API:
запрос таблиц в наборе данных-поскольку мой ответ слишком велик, я включаю параметр allowLargeResults и перенаправляю свой ответ в целевую таблицу.
затем я экспортирую данные из таблицы назначения в GCS ведро.
требования:
предположим, что мой процесс завершается на Шаге 2, я хотел бы повторить этот шаг.
но перед повторным запуском я хотел бы проверить / проверить, что конкретная таблица назначения с именем " xyz " уже существует в наборе данных.
Если он существует, я хотел бы повторно выполните шаг 2.
Если он не существует, я хотел бы сделать foo.
Как я могу это сделать?
спасибо заранее.
4 ответов
вот фрагмент python, который скажет, существует ли таблица:
def doesTableExist(project_id, dataset_id, table_id):
bq.tables().delete(
projectId=project_id,
datasetId=dataset_id,
tableId=table_id).execute()
return False
в качестве альтернативы, если вы предпочитаете не удалять таблицу в процессе, вы можете попробовать:
def doesTableExist(project_id, dataset_id, table_id):
try:
bq.tables().get(
projectId=project_id,
datasetId=dataset_id,
tableId=table_id).execute()
return True
except HttpError, err
if err.resp.status <> 404:
raise
return False
если вы хотите знать, где bq
, можно назвать build_bq_client
отсюда:http://code.google.com/p/bigquery-e2e/source/browse/samples/ch12/auth.py
В общем случае, если вы используете это, чтобы проверить, следует ли запускать задание, которое изменит таблицу, это может быть хорошей идеей просто сделать работу в любом случае, и использовать WRITE_TRUNCATE
как написать нравом.
другой подход может заключаться в создании предсказуемого идентификатора задания и повторной попытке задания с этим идентификатором. Если задание уже существует, оно уже выполнено (однако может потребоваться двойная проверка, чтобы убедиться, что задание не завершилось неудачно).
решение Alex F работает на v0.27, но не будет работать на более поздних версиях. Для того, чтобы переход на v0.28+, указанных ниже решение будет работать.
from google.cloud import bigquery
project_nm = 'gc_project_nm'
dataset_nm = 'ds_nm'
table_nm = 'tbl_nm'
client = bigquery.Client(project_nm)
dataset = client.dataset(dataset_nm)
table_ref = dataset.table(table_nm)
def if_tbl_exists(client, table_ref):
from google.cloud.exceptions import NotFound
try:
client.get_table(table_ref)
return True
except NotFound:
return False
if_tbl_exists(client, table_ref)
наслаждайтесь:
def doesTableExist(bigquery, project_id, dataset_id, table_id):
try:
bigquery.tables().get(
projectId=project_id,
datasetId=dataset_id,
tableId=table_id).execute()
return True
except Exception as err:
if err.resp.status != 404:
raise
return False
в исключении есть редактирование.
С my_bigquery
быть экземпляром класса google.cloud.bigquery.Client
(уже аутентифицирован и связан с проектом):
my_bigquery.dataset(dataset_name).table(table_name).exists() # returns boolean
он выполняет вызов API для проверки наличия таблицы с помощью запроса GET
он работает для меня, используя 0.27 модуля Google Bigquery Python