Как да генерирате CREATE TABLE скрипт от съществуваща таблица

Създавам таблица с интерфейс Big Query. Голяма маса. И бих искал да експортирам схемата на тази таблица в стандартен SQL (или Legacy SQL) синтаксис.

Възможно ли е ?

Благодаря !


person jeremieca    schedule 02.02.2018    source източник


Отговори (3)


Както може да се прочете в този въпрос не е възможно да се направи това и там е заявка за функция за получаване на изходната схема на стандартна 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"
  }
]

След това този масив от полета може да бъде копиран/поставен (или допълнително автоматизиран) в редактора на полета, когато създавате нова таблица с помощта на потребителския интерфейс.

person Guillem Xercavins    schedule 03.02.2018

Не съм сигурен как е възможно да се използва синтаксис на StandardSQL или Legacy SQL. Но можете да получите схемата във формат json с помощта на командния ред.

От тази връзка командата за това ще бъде :

bq show --schema --format=prettyjson [PROJECT_ID]:[DATASET].[TABLE] > [PATH_TO_FILE]
person Syed Arefinul Haque    schedule 02.02.2018
comment
Да, знам това. :) - person jeremieca; 02.02.2018

Можете да получите DDL за таблица с тази заявка:

SELECT t.ddl
FROM `your_project.dataset.INFORMATION_SCHEMA.TABLES` t
WHERE t.table_name = 'your_table_name'
;
person Renae    schedule 13.07.2021