Я создаю таблицу с интерфейсом Big Query. Большой стол. И я хотел бы экспортировать схему этой таблицы в стандартном синтаксисе SQL (или Legacy SQL).
Является ли это возможным ?
Спасибо !
Я создаю таблицу с интерфейсом Big Query. Большой стол. И я хотел бы экспортировать схему этой таблицы в стандартном синтаксисе SQL (или Legacy SQL).
Является ли это возможным ?
Спасибо !
Как можно прочитать в этом вопросе невозможно сделать так и там представляет собой запрос функции для получения выходной схемы стандартного SQL-запроса, но похоже, что это не так. наконец реализовано. В зависимости от вашего варианта использования, помимо использования bq
, другим обходным путем является выполнение запроса с помощью LIMIT 0
. Результаты возвращаются немедленно (проверено с таблицей строк 100B) с именами и типами полей схемы.
Зная это, вы также можете автоматизировать процедуру на своем любимом языке сценариев. В качестве примера я использовал Cloud Shell в качестве вызовов CLI и API. Он делает три последовательных вызова, из которых выполняется первый. получен запрос и jobId (ненужные поля не включаются в URL-адрес запроса), затем мы получаем набор данных и идентификаторы таблиц, соответствующие этой конкретной работе, и наконец, схема получена. Я использовал инструмент jq
для анализа ответов (руководство), который предустановлен в командной консоли. , и завернул все в функции оболочки:
result_schema()
{
QUERY=$1
authToken="$(gcloud auth print-access-token)"
projectId=$(gcloud config get-value project 2>\dev\null)
# get the jobId
jobId=$(curl -H"Authorization: Bearer $authToken" \
-H"Content-Type: application/json" \
https://www.googleapis.com/bigquery/v2/projects/$projectId/queries?fields=jobReference%2FjobId \
-d"$( echo "{
\"query\": "\""$QUERY" limit 0\"",
\"useLegacySql\": false
}")" 2>\dev\null|jq -j .jobReference.jobId)
# get destination table
read -r datasetId tableId <<< $(curl -H"Authorization: Bearer $authToken" \
"https://www.googleapis.com/bigquery/v2/projects/$projectId/jobs/$jobId?fields=configuration(query(destinationTable(datasetId%2CtableId)))" 2>\dev\null | jq -j '.configuration.query.destinationTable.datasetId, " " ,.configuration.query.destinationTable.tableId')
# get resulting schema
curl -H"Authorization: Bearer $authToken" https://www.googleapis.com/bigquery/v2/projects/$projectId/datasets/$datasetId/tables/$tableId?fields=schema 2>\dev\null | jq .schema.fields
}
затем мы можем вызвать функцию, запросив общедоступный набор данных из 100 бит (не указывайте LIMIT 0
, так как функция добавляет его автоматически):
result_schema 'SELECT year, month, CAST(wikimedia_project as bytes) AS project_bytes, language AS lang FROM `bigquery-samples.wikipedia_benchmark.Wiki100B` GROUP BY year, month, wikimedia_project, language'
со следующим выводом в качестве схемы (обратите внимание на выбранные поля, используя приведения и псевдонимы для изменения возвращаемой схемы):
[
{
"name": "year",
"type": "INTEGER",
"mode": "NULLABLE"
},
{
"name": "month",
"type": "INTEGER",
"mode": "NULLABLE"
},
{
"name": "project_bytes",
"type": "BYTES",
"mode": "NULLABLE"
},
{
"name": "lang",
"type": "STRING",
"mode": "NULLABLE"
}
]
Затем этот массив полей можно скопировать/вставить (или дополнительно автоматизировать) в редакторе полей при создании новой таблицы с помощью пользовательского интерфейса.
Я не уверен, как это возможно с использованием синтаксиса StandardSQL или Legacy SQL. Но вы можете получить схему в формате json с помощью командной строки.
По этой ссылке команда для этого будет :
bq show --schema --format=prettyjson [PROJECT_ID]:[DATASET].[TABLE] > [PATH_TO_FILE]
Вы можете получить DDL для таблицы с помощью этого запроса:
SELECT t.ddl
FROM `your_project.dataset.INFORMATION_SCHEMA.TABLES` t
WHERE t.table_name = 'your_table_name'
;