Как сгенерировать скрипт CREATE TABLE из существующей таблицы

Я создаю таблицу с интерфейсом Big Query. Большой стол. И я хотел бы экспортировать схему этой таблицы в стандартном синтаксисе SQL (или Legacy SQL).

Является ли это возможным ?

Спасибо !


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


Ответы (3)


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

Затем этот массив полей можно скопировать/вставить (или дополнительно автоматизировать) в редакторе полей при создании новой таблицы с помощью пользовательского интерфейса.

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