Как я могу создать новый вид в 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)