BigQuery-проверить, существует ли таблица

У меня есть набор данных в BigQuery. Этот набор данных содержит несколько таблиц.

Я делаю следующие шаги программно, используя BigQuery API:

  1. запрос таблиц в наборе данных-поскольку мой ответ слишком велик, я включаю параметр allowLargeResults и перенаправляю свой ответ в целевую таблицу.

  2. затем я экспортирую данные из таблицы назначения в 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

источник: https://googlecloudplatform.github.io/google-cloud-python/0.24.0/bigquery-table.html#google.cloud.bigquery.table.Table.exists

он работает для меня, используя 0.27 модуля Google Bigquery Python