2015-02-25 2 views
7

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

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

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

  2. Затем я экспортирую данные из таблицы адресатов в ведро GCS.

Требования:

  • Предположим, мой процесс терпит неудачу на шаге 2, я хотел бы повторно запустить этот шаг.

  • Но перед повторным запуском, я хотел бы проверить/проверить, что определенная таблица назначения с именем «xyz» уже существует в наборе данных.

  • Если он существует, я хотел бы повторно запустить шаг 2.

  • Если он не существует, я хотел бы сделать Foo.

Как это сделать?

Заранее спасибо.

+0

Вы когда-нибудь задумывались над тем, чтобы написать заявление? вы можете на самом деле сделать что-то, называемое «write_if_empty», которое блокирует, если в таблице есть ЛЮБЫЕ данные. Или «Write_truncate», который заменит существующие данные вашим текущим. – Patrice

+0

Я действительно изучал это. Я хочу проверить, существует ли таблица перед экспортом в GCS .. не перед записью в таблицу назначения. Параметр write disposition доступен только тогда, когда вы хотите загружать данные в таблицу, запрашивать таблицу и копировать существующую таблицу. Но не при извлечении в GCS. Это было мое понимание. Возможно, я ошибаюсь. Есть предположения? – activelearner

+0

нет, ты совершенно прав. Ваш вопрос просто казался довольно широким, поэтому я не был на 100% уверен, где вы хотели поймать проблему. Ну, я имею в виду ... вы используете какой язык? : P Нам нужно немного мяса для этого вопроса, чтобы иметь возможность изучить его. Определенный способ с API BigQuery посмотреть, существует ли таблица ... – Patrice

ответ

7

Вот питон фрагмент кода, который будет сказать, существует ли таблица:

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

В общем, если вы используете t его проверить, следует ли запускать задание, которое изменит таблицу, может быть хорошей идеей просто выполнить работу в любом случае и использовать WRITE_TRUNCATE в качестве записи.

Другим подходом может быть создание предсказуемого идентификатора задания и повторное задание с этим идентификатором. Если задание уже существует, работа уже выполнена (возможно, вы захотите дважды проверить, чтобы убедиться, что задание не сработало, однако).

+0

Спасибо, Джордан. Я смог успешно создать клиентский объект bq из действительных учетных данных. Используя bq, я смог реализовать функцию doTableExist. – activelearner

+0

404 также может означать, что ресурс не существует по целому ряду причин, в то время как пользователь считает, что таблица просто не существует. Работает сейчас? Может быть. После N лет «работы» попытайтесь обнаружить ошибку. –

+0

, если у вас уже есть инстанцированный клиент, существует метод '.exists()'. См. Мой ответ на странице https://stackoverflow.com/a/47884257/92471 –

1

Наслаждайтесь:

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 

Существует правку в исключения.

0

С my_bigquery быть экземпляром класса google.cloud.bigquery.Client (уже authentified и связанные с проектом):

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

+1

Это слово нарушено для google-cloud-bigquery == 0.28 –

0

Решение Alex F работает на v0.27, но не будет работать в более поздних версиях. Для того, чтобы migrate to 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) 
Смежные вопросы