Създавам таблица с интерфейс Big Query. Голяма маса. И бих искал да експортирам схемата на тази таблица в стандартен SQL (или Legacy SQL) синтаксис.
Възможно ли е ?
Благодаря !
Създавам таблица с интерфейс Big Query. Голяма маса. И бих искал да експортирам схемата на тази таблица в стандартен SQL (или Legacy SQL) синтаксис.
Възможно ли е ?
Благодаря !
Както може да се прочете в този въпрос не е възможно да се направи това и там е заявка за функция за получаване на изходната схема на стандартна SQL заявка, но изглежда, че не е най-накрая приложен. В зависимост от вашия случай на употреба, освен използването на bq
, друго решение е да направите заявка с LIMIT 0
. Резултатите се връщат незабавно (тествани с таблица с редове от 100 B) с имената и типовете полета на схемата.
Знаейки това, можете също да автоматизирате процедурата на любимия си скриптов език. Като пример използвах Cloud Shell като CLI и API извиквания. Той прави три последователни извиквания, като първото се изпълнява заявката и се получава jobId (ненужните полета не са включени в URL адреса на заявката), след това получаваме набора от данни и идентификационните номера на таблиците, съответстващи на тази конкретна работа и накрая, схемата се извлича. Използвах инструмента jq
, за да анализирам отговорите (ръчно), който идва предварително инсталиран в Shell и обви всичко в функция на обвивката:
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
}
тогава можем да извикаме функцията, като направим заявка за публичен набор от данни от 100B ред (не посочвайте 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'
;