Как я могу создать новый вид в BigQuery, используя API Python?

У меня есть код, который автоматически генерирует кучу разных SQL-запросов, которые я хотел бы вставить в большой запрос для генерации представлений, хотя одна из проблем, с которыми я сталкиваюсь, заключается в том, что эти представления необходимо генерировать динамически каждую ночь из-за меняющейся природы данных. Так что я хотел бы иметь возможность использовать API Google BigQuery для Python, чтобы иметь возможность сделать представление. Я понимаю, как это сделать с помощью инструмента командной строки 'bq', но я хотел бы иметь возможность встроить это непосредственно в код, а не использовать оболочку для запуска bq. Я играл с кодом, предоставленным на

https://cloud.google.com/bigquery/bigquery-api-quickstart

Я не понимаю, как использовать этот бит кода для создания представления вместо того, чтобы просто возвращать результаты оператора SELECT. Я могу увидеть документацию о вставке таблицы здесь

https://cloud.google.com/bigquery/docs/reference/v2/tables/insert

но это относится к использованию REST API для генерации новых таблиц, в отличие от приведенного выше примера.

Разве это просто невозможно? Должен ли я просто сдаться и использовать БК?

Спасибо

*** Некоторые дополнительные вопросы в ответ на комментарии Фелипе.

Документ таблицы ресурсов указывает на наличие ряда обязательных полей, некоторые из которых имеют смысл, даже если я не до конца понимаю, о чем они просят, а другие - нет. Например, externalDataConfiguration.schema. Относится ли это к схеме базы данных, к которой я подключаюсь (я полагаю, это так), или к схеме хранения данных?

Как насчет externalDataConfiguration.sourceFormat? Так как я пытаюсь просмотреть уже существующую базу данных, я не уверен, что понимаю, насколько важен исходный формат. Это исходный формат базы данных, из которой я делаю вид? Как бы я это опознал?

ANd externalDataConfiguration.sourceUris [], я не импортирую новые данные в базу данных, поэтому не понимаю, как это (или предыдущий элемент) требуется.

А как насчет схемы?

tableReference.datasetId, tableReference.projectId и tableReference.tableId говорят сами за себя.

Тип будет view, а view.query будет фактическим SQL-запросом, используемым для создания представления. Итак, я понимаю, почему они необходимы для создания представления, но я не понимаю другие части.

Можете ли вы помочь мне понять эти детали?

Спасибо бред

3 ответа

Решение

Все, что делает веб-интерфейс или инструмент bq, делается через API BigQuery, так что пока не сдавайтесь:).

Создание представления похоже на создание таблицы, просто убедитесь, что у вас есть ресурс таблицы, который содержит свойство представления, когда вы вызываете tables.insert(),

Используя https://cloud.google.com/bigquery/docs/reference/rest/v2/tables/insert

Отправьте что-то вроде ниже, при условии, что вы добавляете авторизацию

{
  "view": {
    "query": "select column1, count(1) `project.dataset.someTable` group by 1",
    "useLegacySql": false
  },
  "tableReference": {
    "tableId": "viewName",
    "projectId": "projectName",
    "datasetId": "datasetName"
  }
}

В качестве альтернативы в Python, предполагая, что у вас есть настроенный ключ службы и переменная среды GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/key. Единственное предостережение в том, что, насколько я могу судить, это может создавать только представления с использованием устаревшего sql, а в качестве расширения можно запрашивать только с использованием устаревшего sql, хотя прямой метод API допускает использование устаревшего или стандартного.

from google.cloud import bigquery

def create_view(dataset_name, view_name, project, viewSQL):

    bigquery_client = bigquery.Client(project=project)

    dataset = bigquery_client.dataset(dataset_name)
    table = dataset.table(view_name)

    table.view_query = viewSQL

    try:
        table.create()
        return True
    except Exception as err:
        print(err)
        return False

Примечание: это немного изменилось с библиотекой 0.28.0 - подробности см. В следующем: Google BigQuery: создание представления через Python google-cloud-bigquery версии 0.27.0 против 0.28.0

мой пример функции

# create a view via python
def create_view(dataset_name, view_name, sqlQuery, project=None):
    try:

        bigquery_client = bigquery.Client(project=project)
        dataset_ref = bigquery_client.dataset(dataset_name)
        table_ref = dataset_ref.table(view_name)
        table = Table(table_ref)
        table.view_query = sqlQuery
        table.view_use_legacy_sql = False
        bigquery_client.create_table(table)

        return True

    except Exception as e:
        errorStr = 'ERROR (create_view): ' + str(e)
        print(errorStr)
        raise

Большой запрос.версия -> '1.10.0'

def create_view(client, dataset_name, view_name, view_query):
    try:
        dataset_ref = client.dataset(dataset_name)
        view = dataset_ref.table(view_name)
        # view.table_type = 'VIEW'
        view.view_query = view_query
        view.view_query_legacy_sql  = False
        client.create_table(view)
        pass
    except Exception as e:
        errorStr = 'ERROR (create_view): ' + str(e)
        print(errorStr)
        raise

создать таблицу, а не представление!!!!

Это правильный код для создания представления:

def create_view(client, dataset_name, view_name, view_query):
    try:
        dataset_ref = client.dataset(dataset_name)
        view_ref = dataset_ref.table(view_name)
        table = bigquery.Table(view_ref)
        table.view_query = view_query
        table.view_use_legacy_sql = False
        client.create_table(table)
    except Exception as e:
        errorStr = 'ERROR (create_view): ' + str(e)
        print(errorStr)
        raise

Является необходимым

table = bigquery.Table(view_ref)
Другие вопросы по тегам