Хотя потенциальные изменения, вносимые в схему таблицы в Google BigQuery, довольно ограничены, по существу есть два типа изменений, которые вам разрешено выполнять. Вы можете добавить новый столбец NULLABLE
или REPEATED
столбец или изменить существующий столбец mode
(с REQUIRED
на NULLABLE
). Помимо этого, BigQuery не допускает многих других изменений, таких как удаление или переименование столбцов (хотя это можно выполнить косвенно, скопировав столбцы, которые вы хотите сохранить, в новую таблицу, уничтожив исходную, а затем создав таблицу замены с новыми данными. ).
А пока мы рассмотрим методы добавления нового столбца в таблицу в этом руководстве.
Добавление столбца через веб-интерфейс
Добавление столбца через BigQuery WebUI – очень простой процесс:
- Откройте BigQuery WebUI .
- Выберите
project
,dataset
и наконец ,table
вы хотите изменить. - Щелкните
Add New Fields
кнопку. - Для каждого поля, которое вы хотите добавить, введите
name
, выберитеtype
и изменитеmode
(при необходимости). - По завершении нажмите
Add to Table
кнопку, чтобы завершить обновления.
Добавление вложенных записей
Для добавления более сложных схем, таких как вложенные поля в Record
поле типа, щелкните +
символ рядом с Record
полем выбора типа. Теперь новое поле поля, которое было добавлено, будет вложено в Record
поле выше.
Добавление столбца через API
Чтобы обновить таблицу и добавить новый столбец с помощью API BigQuery, у вас есть два варианта выбора метода: Tables.patch
или Tables.update
. Tables.patch
обновляет только те поля, которые добавляются / изменяются, тогда как Tables.update
заменяет весь ресурс таблицы на новую предоставленную вами схему. Поэтому почти во всех случаях Tables.patch
это предпочтительный метод.
Как и во всех вызовах API в BigQuery, ключом является правильное форматирование строки конфигурации перед ее отправкой в метод API. В этом случае, вызов Tables.patch
требует полной таблицы schema
будет поставляться, который только содержит fields
список, который представляет собой список полей , содержащих name
, mode
и type
значения.
Важно отметить, что независимо от того, добавляете ли вы столбцы или просто обновляете modes
существующие столбцы, вы должны предоставить полную схему для вызова API.
Например, мы имеем простую melville
таблицу с несколькими существующими полями: BookMeta_Title
, BookMeta_Date
, BookMeta_Creator
, BookMeta_Language
, и BookMeta_Publisher
. Мы хотим добавить last_updated
поле TIMESTAMP
type
, чтобы весь наш сценарий конфигурации для API выглядел так:
{
"schema": {
"fields": [
{
"mode": "NULLABLE",
"name": "BookMeta_Title",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "BookMeta_Date",
"type": "TIMESTAMP"
},
{
"mode": "NULLABLE",
"name": "BookMeta_Creator",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "BookMeta_Language",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "BookMeta_Publisher",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "last_updated",
"type": "TIMESTAMP"
}
]
}
}
По сути, все, что мы сделали, это точно перечислили все существующие поля, а затем добавили наше новое last_updated
поле внизу. После отправки через вызов патча API мы получаем ожидаемый результат:
{
"kind": "bigquery#table",
"etag": "\"T7tifokHjXTVbjJPVpstHNnQ7nk/MTQ2OTMyMzMyOTIxMQ\"",
"id": "bookstore-1382:exports.melville",
"selfLink": "https://www.googleapis.com/bigquery/v2/projects/bookstore-1382/datasets/exports/tables/melville",
"tableReference": {
"projectId": "bookstore-1382",
"datasetId": "exports",
"tableId": "melville"
},
"schema": {
"fields": [
{
"name": "BookMeta_Title",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "BookMeta_Date",
"type": "TIMESTAMP",
"mode": "NULLABLE"
},
{
"name": "BookMeta_Creator",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "BookMeta_Language",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "BookMeta_Publisher",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "last_updated",
"type": "TIMESTAMP",
"mode": "NULLABLE"
}
]
},
"numBytes": "1344",
"numLongTermBytes": "0",
"numRows": "12",
"creationTime": "1469323329211",
"lastModifiedTime": "1469323329211",
"type": "TABLE"
}
И, конечно же, теперь в схему таблицы добавлено наше новое поле!