修改表架构
本文档介绍了如何修改现有 BigQuery 表的架构定义。
您可以使用 SQL 数据定义语言 (DDL) 语句执行本文档中所述的大多数架构修改。这些语句不会产生费用。
您可以通过将表数据导出到 Cloud Storage 并在随后将数据加载到已修改了架构定义的新表中,使用此页面上介绍的所有方法来修改表架构。 BigQuery 加载和导出作业是免费的,但将导出的数据存储在 Cloud Storage 中会产生费用。以下部分介绍了执行各种类型架构修改的其他方法。
添加列
您可以使用以下选项之一向现有表的架构定义中添加列:
- 添加新的空列。
- 使用加载或查询作业覆盖表。
- 通过加载或查询作业将数据附加到表中。
添加的任何列都必须遵守 BigQuery 的列名称规则。如需详细了解如何创建架构组件,请参阅指定架构。
添加空列
如果向现有表架构添加新列,则该列必须是 NULLABLE
或 REPEATED
。不能向现有表架构添加 REQUIRED
列。使用 API 或 bq 命令行工具向现有表架构添加 REQUIRED
列会导致错误。但是,您可以创建嵌套的 REQUIRED
列以作为新的 RECORD
字段的一部分。只有在加载数据时创建表或者创建具有架构定义的空表时,才能添加 REQUIRED
列。
如需向表的架构定义中添加空列,请按如下所述操作:
控制台
在 Google Cloud 控制台中,转到 BigQuery 页面。
在探索器面板中,展开您的项目和数据集,然后选择表。
在详细信息面板中,点击架构标签页。
点击修改架构。您可能需要滚动才能看到此按钮。
在当前架构页面中的新字段下,点击添加字段。
添加完列后,点击保存。
SQL
使用 ALTER TABLE ADD COLUMN
DDL 语句:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,输入以下语句:
ALTER TABLE mydataset.mytable ADD COLUMN new_column STRING;
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
bq
发出 bq update
命令并提供 JSON 架构文件。如果要更新的表在非默认项目中,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET
。
bq update PROJECT_ID:DATASET.TABLE SCHEMA
请替换以下内容:
PROJECT_ID
:您的项目 ID。DATASET
:要更新的表所属数据集的名称。TABLE
:要更新的表的名称。SCHEMA
:本地机器上 JSON 架构文件的路径。
指定内嵌架构时,不能指定列说明、模式和 RECORD
(STRUCT
) 类型。所有列模式均默认为 NULLABLE
。因此,如果您要向某个 RECORD
中添加新的嵌套列,则必须提供 JSON 架构文件。
如果尝试使用内嵌架构定义添加列,则必须提供包含新列的整个架构定义。由于您无法使用内嵌架构定义来指定列模式,因此更新会将任何现有 REPEATED
列更改为 NULLABLE
,从而产生以下错误:BigQuery error in update
operation: Provided Schema does not match Table
PROJECT_ID:dataset.table. Field field has changed mode
from REPEATED to NULLABLE.
使用 bq 命令行工具向现有表添加列的首选方法是提供 JSON 架构文件。
如需使用 JSON 架构文件将空列添加到表的架构,请执行以下操作:
首先,发出带有
--schema
标志的bq show
命令,并将现有表架构写入文件。如果要更新的表在非默认项目中,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET
。bq show \ --schema \ --format=prettyjson \ PROJECT_ID:DATASET.TABLE > SCHEMA
请替换以下内容:
PROJECT_ID
:您的项目 ID。DATASET
:要更新的表所属数据集的名称。TABLE
:要更新的表的名称。SCHEMA
:写入本地机器的架构定义文件。
例如,如需将
mydataset.mytable
的架构定义写入文件,请输入以下命令。mydataset.mytable
属于默认项目。bq show \ --schema \ --format=prettyjson \ mydataset.mytable > /tmp/myschema.json
在文本编辑器中打开架构文件。架构应如下所示:
[ { "mode": "REQUIRED", "name": "column1", "type": "STRING" }, { "mode": "REQUIRED", "name": "column2", "type": "FLOAT" }, { "mode": "REPEATED", "name": "column3", "type": "STRING" } ]
将新列添加到架构定义的末尾。如果尝试在数组的其他位置添加新列,则系统会返回以下错误:
BigQuery error in update operation: Precondition Failed
。您可以使用 JSON 文件为新列指定说明、
NULLABLE
或REPEATED
模式以及RECORD
类型。例如,使用上一步中的架构定义,新的 JSON 数组可能如下所示。在此示例中,添加了名为column4
的新NULLABLE
列。column4
包含说明。[ { "mode": "REQUIRED", "name": "column1", "type": "STRING" }, { "mode": "REQUIRED", "name": "column2", "type": "FLOAT" }, { "mode": "REPEATED", "name": "column3", "type": "STRING" }, { "description": "my new column", "mode": "NULLABLE", "name": "column4", "type": "STRING" } ]
要详细了解如何使用 JSON 架构文件,请参阅指定 JSON 架构文件。
更新架构文件后,发出以下命令来更新表的架构。如果要更新的表在非默认项目中,请按以下格式将相应项目 ID 添加到数据集名称中:
PROJECT_ID:DATASET
。bq update PROJECT_ID:DATASET.TABLE SCHEMA
请替换以下内容:
PROJECT_ID
:您的项目 ID。DATASET
:要更新的表所属数据集的名称。TABLE
:要更新的表的名称。SCHEMA
:写入本地机器的架构定义文件。
例如,输入以下命令可更新默认项目中
mydataset.mytable
的架构定义。本地机器上架构文件的路径为/tmp/myschema.json
。bq update mydataset.mytable /tmp/myschema.json
API
调用 tables.patch
方法并使用 schema
属性向架构定义中添加空列。由于 tables.update
方法会替换整个表资源,因此建议使用 tables.patch
方法。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
向 Table.schema 的副本附加一个新的 SchemaField 对象,然后将 Table.schema 属性的值替换为更新后的架构。向 RECORD
列添加嵌套列
除了向表架构添加新列之外,您还可以向 RECORD
列添加新的嵌套列。添加新嵌套列的过程与添加新列的过程相似。
控制台
Google Cloud 控制台不支持向现有 RECORD
列添加新的嵌套字段。
SQL
不支持使用 SQL DDL 语句向现有 RECORD
列添加新的嵌套字段。
bq
发出 bq update
命令,并提供用来向现有 RECORD
列的架构定义添加嵌套字段的 JSON 架构文件。如果要更新的表在非默认项目中,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET
。
bq update PROJECT_ID:DATASET.TABLE SCHEMA
请替换以下内容:
PROJECT_ID
:您的项目 ID。DATASET
:要更新的表所属数据集的名称。TABLE
:要更新的表的名称。SCHEMA
:本地机器上 JSON 架构文件的路径。
指定内嵌架构时,不能指定列说明、模式和 RECORD
(STRUCT
) 类型。所有列模式均默认为 NULLABLE
。因此,如果您要向某个 RECORD
中添加新的嵌套列,则必须提供 JSON 架构文件。
要使用 JSON 架构文件将嵌套列添加到 RECORD
,请执行以下操作:
首先,发出带有
--schema
标志的bq show
命令,并将现有表架构写入文件。如果要更新的表在非默认项目中,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET.TABLE
。bq show \ --schema \ --format=prettyjson \ PROJECT_ID:DATASET.TABLE > SCHEMA
请替换以下内容:
PROJECT_ID
:您的项目 ID。DATASET
:要更新的表所属数据集的名称。TABLE
:要更新的表的名称。SCHEMA
:写入本地机器的架构定义文件。
例如,如需将
mydataset.mytable
的架构定义写入文件,请输入以下命令。mydataset.mytable
属于默认项目。bq show \ --schema \ --format=prettyjson \ mydataset.mytable > /tmp/myschema.json
在文本编辑器中打开架构文件。架构应如下所示。在本例中,
column3
是嵌套的重复列。嵌套列为nested1
和nested2
。fields
数组列出了column3
中嵌套的字段。[ { "mode": "REQUIRED", "name": "column1", "type": "STRING" }, { "mode": "REQUIRED", "name": "column2", "type": "FLOAT" }, { "fields": [ { "mode": "NULLABLE", "name": "nested1", "type": "STRING" }, { "mode": "NULLABLE", "name": "nested2", "type": "STRING" } ], "mode": "REPEATED", "name": "column3", "type": "RECORD" } ]
将新的嵌套列添加到
fields
数组的末尾。在本例中,nested3
是新的嵌套列。[ { "mode": "REQUIRED", "name": "column1", "type": "STRING" }, { "mode": "REQUIRED", "name": "column2", "type": "FLOAT" }, { "fields": [ { "mode": "NULLABLE", "name": "nested1", "type": "STRING" }, { "mode": "NULLABLE", "name": "nested2", "type": "STRING" }, { "mode": "NULLABLE", "name": "nested3", "type": "STRING" } ], "mode": "REPEATED", "name": "column3", "type": "RECORD" } ]
要详细了解如何使用 JSON 架构文件,请参阅指定 JSON 架构文件。
更新架构文件后,发出以下命令来更新表的架构。如果要更新的表在非默认项目中,请按以下格式将相应项目 ID 添加到数据集名称中:
PROJECT_ID:DATASET
。bq update PROJECT_ID:DATASET.TABLE SCHEMA
请替换以下内容:
PROJECT_ID
:您的项目 ID。DATASET
:要更新的表所属数据集的名称。TABLE
:要更新的表的名称。SCHEMA
:本地机器上 JSON 架构文件的路径。
例如,输入以下命令可更新默认项目中
mydataset.mytable
的架构定义。本地机器上架构文件的路径为/tmp/myschema.json
。bq update mydataset.mytable /tmp/myschema.json
API
调用 tables.patch
方法并使用 schema
属性将嵌套列添加到架构定义中。由于 tables.update
方法会替换整个表资源,因此建议使用 tables.patch
方法。
覆盖或附加数据时添加列
当您向现有表加载数据和选择覆盖现有表时,可以向现有表添加新列。当覆盖现有表时,您正在加载的数据的架构将用于覆盖现有表的架构。如需了解如何使用加载作业来覆盖表,请参阅数据格式的文档:
在加载附加作业中添加列
在加载作业中向表附加数据时,您可以向表添加列。新架构由以下其中一种方式确定:
- 自动检测(针对 CSV 和 JSON 文件)
- JSON 架构文件中指定的架构(针对 CSV 和 JSON 文件)
- Avro、ORC、Parquet 和 Datastore 导出文件的自描述源数据
如果在 JSON 文件中指定架构,则必须在其中定义新列。如果缺少新列定义,则系统会在您尝试附加数据时返回错误。
在附加操作期间添加新列时,新列中现有行的值会设为 NULL
。
如需在加载作业期间向表附加数据时添加新列,请使用以下选项之一:
bq
使用 bq load
命令加载数据,并指定 --noreplace
标志以表明您要将数据附加到现有表。
如果要附加的数据采用的是 CSV 格式或以换行符分隔的 JSON 格式,请指定 --autodetect
标志以使用架构自动检测功能,或在 JSON 架构文件中提供架构。添加的列可以从 Avro 或 Datastore 导出文件自动推断出来。
将 --schema_update_option
标志设置为 ALLOW_FIELD_ADDITION
,以表明您要附加的数据包含新列。
如果要附加的表在非默认项目的数据集中,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET
。
(可选)提供 --location
标志并将其值设置为您的位置。
输入 load
命令,如下所示:
bq --location=LOCATION load \ --noreplace \ --autodetect \ --schema_update_option=ALLOW_FIELD_ADDITION \ --source_format=FORMAT \ PROJECT_ID:DATASET.TABLE \ PATH_TO_SOURCE \ SCHEMA
请替换以下内容:
LOCATION
:您所在位置的名称。--location
是可选标志。例如,如果您在东京区域使用 BigQuery,请将该标志的值设置为asia-northeast1
。您可以使用 .bigqueryrc 文件设置该位置的默认值。FORMAT
:架构的格式。NEWLINE_DELIMITED_JSON
、CSV
、AVRO
、PARQUET
、ORC
或DATASTORE_BACKUP
。PROJECT_ID
:您的项目 ID。DATASET
:包含该表的数据集的名称。TABLE
:要附加的表的名称。PATH_TO_SOURCE
:可以是完全限定的 Cloud Storage URI、以英文逗号分隔的 URI 列表,或指向本地机器上数据文件的路径。SCHEMA
:本地 JSON 架构文件的路径。如果未指定--autodetect
,只有 CSV 和 JSON 文件才需要架构文件。Avro 和 Datastore 架构是根据源数据推断出来的。
示例:
输入以下命令可使用加载作业将本地 Avro 数据文件 /tmp/mydata.avro
附加到 mydataset.mytable
。由于架构可以根据 Avro 数据自动推断出来,因此您无需使用 --autodetect
标志。mydataset
属于默认项目。
bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_ADDITION \
--source_format=AVRO \
mydataset.mytable \
/tmp/mydata.avro
输入以下命令可使用加载作业将 Cloud Storage 中以换行符分隔的 JSON 数据文件附加到 mydataset.mytable
。--autodetect
标志用于检测新列。mydataset
属于默认项目。
bq load \
--noreplace \
--autodetect \
--schema_update_option=ALLOW_FIELD_ADDITION \
--source_format=NEWLINE_DELIMITED_JSON \
mydataset.mytable \
gs://mybucket/mydata.json
输入以下命令可使用加载作业将 Cloud Storage 中以换行符分隔的 JSON 数据文件附加到 mydataset.mytable
。包含新列的架构在本地 JSON 架构文件 /tmp/myschema.json
中进行指定。mydataset
属于 myotherproject
,而非默认项目。
bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_ADDITION \
--source_format=NEWLINE_DELIMITED_JSON \
myotherproject:mydataset.mytable \
gs://mybucket/mydata.json \
/tmp/myschema.json
API
调用 jobs.insert
方法。配置 load
作业并设置以下属性:
- 使用
sourceUris
属性引用 Cloud Storage 云端存储中的数据。 - 通过设置
sourceFormat
属性来指定数据格式。 - 在
schema
属性中指定架构。 - 使用
schemaUpdateOptions
属性指定架构更新选项。 - 使用
writeDisposition
属性将目标表的写入处置方式设置为WRITE_APPEND
。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
在查询附加作业中添加列
您可以在向表附加查询结果时向表中添加列。
在查询作业中使用附加操作添加列时,查询结果的架构将用于更新目标表的架构。请注意,您无法查询一个位置中的表而将结果写入另一个位置的表。
如需在查询作业期间向表附加数据时添加新列,请选择以下选项之一:
bq
使用 bq query
命令查询数据,并指定 --destination_table
标志以表明您要附加的表。
如需指定您要将查询结果附加到现有的目标表,请指定 --append_table
标志。
将 --schema_update_option
标志设置为 ALLOW_FIELD_ADDITION
,以表明您要附加的查询结果包含新列。
指定 use_legacy_sql=false
标志以使用 GoogleSQL 语法进行查询。
如果要附加的表在非默认项目的数据集中,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET
。请注意,您要查询的表和目标表必须位于同一位置。
(可选)提供 --location
标志并将其值设置为您的位置。
bq --location=LOCATION query \ --destination_table PROJECT_ID:DATASET.TABLE \ --append_table \ --schema_update_option=ALLOW_FIELD_ADDITION \ --use_legacy_sql=false \ 'QUERY'
请替换以下内容:
LOCATION
:您所在位置的名称。--location
是可选标志。例如,如果您在东京区域使用 BigQuery,请将该标志的值设置为asia-northeast1
。您可以使用 .bigqueryrc 文件设置该位置的默认值。请注意,您无法将查询结果附加到另一个位置的表。PROJECT_ID
:您的项目 ID。dataset
:要附加的表所属数据集的名称。TABLE
:要附加的表的名称。QUERY
:采用 GoogleSQL 语法的查询。
示例:
在默认项目中输入以下命令查询 mydataset.mytable
,并将查询结果附加到 mydataset.mytable2
(也在默认项目中)。
bq query \
--destination_table mydataset.mytable2 \
--append_table \
--schema_update_option=ALLOW_FIELD_ADDITION \
--use_legacy_sql=false \
'SELECT
column1,column2
FROM
mydataset.mytable'
在默认项目中输入以下命令查询 mydataset.mytable
,并将查询结果附加到 myotherproject
中的 mydataset.mytable2
。
bq query \
--destination_table myotherproject:mydataset.mytable2 \
--append_table \
--schema_update_option=ALLOW_FIELD_ADDITION \
--use_legacy_sql=false \
'SELECT
column1,column2
FROM
mydataset.mytable'
API
调用 jobs.insert
方法。配置 query
作业并设置以下属性:
- 使用
destinationTable
属性指定目标表。 - 使用
writeDisposition
属性将目标表的写入处置方式设置为WRITE_APPEND
。 - 使用
schemaUpdateOptions
属性指定架构更新选项。 - 使用
query
属性指定 GoogleSQL 查询。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
更改列的名称
如需重命名表中的列,请使用 ALTER TABLE RENAME COLUMN
DDL 语句。 以下示例会将 mytable
中的 old_name
列重命名为 new_name
:
ALTER TABLE mydataset.mytable RENAME COLUMN old_name TO new_name;
如需详细了解 ALTER TABLE RENAME COLUMN
语句,请参阅 DDL 详细信息。
更改列的数据类型
Google Cloud 控制台、bq 命令行工具和 BigQuery API 不支持更改列的数据类型。如果您尝试通过应用一种架构来为列指定新的数据类型,从而更新表,则系统会返回错误。
使用 DDL 语句更改列的数据类型
您可以使用 GoogleSQL 对列的数据类型进行某些更改。如需了解详情并查看支持的数据类型转换的完整列表,请参阅 ALTER COLUMN SET DATA TYPE
DDL 语句。
以下示例创建一个表,表中包含 INT64
类型的列,然后将类型更新为 NUMERIC
:
CREATE TABLE mydataset.mytable(c1 INT64); ALTER TABLE mydataset.mytable ALTER COLUMN c1 SET DATA TYPE NUMERIC;
以下示例会创建一个包含两个字段的嵌套列的表,然后将其中一个列的类型从 INT
更新为 NUMERIC
:
CREATE TABLE mydataset.mytable(s1 STRUCT<a INT64, b STRING>); ALTER TABLE mydataset.mytable ALTER COLUMN s1 SET DATA TYPE STRUCT<a NUMERIC, b STRING>;
转换列的数据类型
要将列的数据类型更改为可转换类型,请使用 SQL 查询来选择表数据,然后转换相关数据并覆盖表。对于非常大的表,不建议进行类型转换和覆盖,因为需要进行全表扫描。
以下示例展示了一个 SQL 查询,该查询会选择 mydataset.mytable
中 column_two
和 column_three
的所有数据,并将 column_one
的类型从 DATE
转换为 STRING
。查询结果用于覆盖现有表。覆盖后的表会将 column_one
存储为 STRING
数据类型。
在使用 CAST
时,如果 BigQuery 无法执行类型转换,查询就会失败。如需详细了解 GoogleSQL 中的类型转换规则,请参阅类型转换。
控制台
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中输入以下查询,选择
mydataset.mytable
中column_two
和column_three
的所有数据,并将column_one
的类型从DATE
转换为STRING
。该查询使用别名对column_one
进行类型转换,并且名称保持相同。mydataset.mytable
属于默认项目。SELECT column_two, column_three, CAST(column_one AS STRING) AS column_one FROM mydataset.mytable;
点击更多,然后选择查询设置。
在目标部分,执行以下操作:
选择为查询结果设置目标表。
对于项目名称,将值保留设置为默认项目, 即包含
mydataset.mytable
的项目。对于数据集,选择
mydataset
。在表 ID 字段中,输入
mytable
。对于目标表的写入设置,选择覆盖表。此选项会使用查询结果覆盖
mytable
。
(可选)选择数据的位置。
要更新设置,请点击保存。
点击
运行。查询作业完成后,
column_one
的数据类型为STRING
。
bq
输入以下 bq query
命令,选择 mydataset.mytable
中 column_two
和 column_three
的所有数据,并将 column_one
的类型从 DATE
转换为 STRING
。该查询使用别名对 column_one
进行类型转换,并且名称保持相同。mydataset.mytable
属于默认项目。
使用 --destination_table
标志将查询结果写入 mydataset.mytable
,并使用 --replace
标志以覆盖 mytable
。指定 use_legacy_sql=false
标志以使用 GoogleSQL 语法。
(可选)添加 --location
标志并将其值设置为您的位置。
bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
column_two,
column_three,
CAST(column_one AS STRING) AS column_one
FROM
mydataset.mytable'
API
如需选择 mydataset.mytable
中 column_two
和 column_three
的所有数据,并将 column_one
的类型从 DATE
转换为 STRING
,请调用 jobs.insert
方法并配置一项 query
作业。(可选)在 jobReference
部分的 location
属性中指定您的位置。
查询作业中使用的 SQL 查询为:SELECT column_two,
column_three, CAST(column_one AS STRING) AS column_one FROM
mydataset.mytable
。该查询使用别名来对 column_one
执行类型转换,并且名称保持相同。
如需使用查询结果覆盖 mytable
,请将 mydataset.mytable
添加到 configuration.query.destinationTable
属性中,并在 configuration.query.writeDisposition
属性中指定 WRITE_TRUNCATE
。
更改列的模式
对列的模式的修改仅支持将其从 REQUIRED
更改为 NULLABLE
。将列的模式从 REQUIRED
更改为 NULLABLE
也称为列放宽。此外,您还可以在加载数据以覆盖现有表时,或将数据附加到现有表时,放宽列。 您无法将列的模式从 NULLABLE
更改为 REQUIRED
。
在现有表中使列可以为 NULLABLE
要将列的模式从 REQUIRED
更改为 NULLABLE
,请选择以下选项之一:
控制台
转到 BigQuery 页面。
在探索器面板中,展开您的项目和数据集,然后选择表。
在详细信息面板中,点击架构标签页。
点击修改架构。您可能需要滚动才能看到此按钮。
在当前架构页面中,找到您要更改的字段。
在该字段的模式下拉列表中,选择
NULLABLE
。要更新设置,请点击保存。
SQL
使用 ALTER COLUMN DROP NOT NULL
DDL 语句.
以下示例将列 mycolumn
的模式从 REQUIRED
更改为 NULLABLE
:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,输入以下语句:
ALTER TABLE mydataset.mytable ALTER COLUMN mycolumn DROP NOT NULL;
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
bq
首先,发出带有
--schema
标志的bq show
命令,并将现有表架构写入文件。如果要更新的表在非默认项目中,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET
。bq show \ --schema \ --format=prettyjson \ PROJECT_ID:DATASET.TABLE > SCHEMA_FILE
请替换以下内容:
PROJECT_ID
:您的项目 ID。DATASET
:要更新的表所属数据集的名称。TABLE
:要更新的表的名称。SCHEMA_FILE
:写入本地机器的架构定义文件。
例如,如需将
mydataset.mytable
的架构定义写入文件,请输入以下命令。mydataset.mytable
属于默认项目。bq show \ --schema \ --format=prettyjson \ mydataset.mytable > /tmp/myschema.json
在文本编辑器中打开架构文件。架构应如下所示:
[ { "mode": "REQUIRED", "name": "column1", "type": "STRING" }, { "mode": "REQUIRED", "name": "column2", "type": "FLOAT" }, { "mode": "REPEATED", "name": "column3", "type": "STRING" } ]
将现有列的模式从
REQUIRED
更改为NULLABLE
。在此示例中,放宽了column1
的模式。[ { "mode": "NULLABLE", "name": "column1", "type": "STRING" }, { "mode": "REQUIRED", "name": "column2", "type": "FLOAT" }, { "mode": "REPEATED", "name": "column3", "type": "STRING" } ]
要详细了解如何使用 JSON 架构文件,请参阅指定 JSON 架构文件。
更新架构文件后,发出以下命令来更新表的架构。如果要更新的表在非默认项目中,请按以下格式将相应项目 ID 添加到数据集名称中:
PROJECT_ID:DATASET
。bq update PROJECT_ID:DATASET.TABLE SCHEMA
请替换以下内容:
PROJECT_ID
:您的项目 ID。DATASET
:要更新的表所属数据集的名称。TABLE
:要更新的表的名称。SCHEMA
:本地机器上 JSON 架构文件的路径。
例如,输入以下命令可更新默认项目中
mydataset.mytable
的架构定义。本地机器上架构文件的路径为/tmp/myschema.json
。bq update mydataset.mytable /tmp/myschema.json
API
调用 tables.patch
并使用 schema
属性将架构定义中的 REQUIRED
列更改为 NULLABLE
。由于 tables.update
方法会替换整个表资源,因此建议使用 tables.patch
方法。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
使用 SchemaField 对象列表覆盖 Table.schema 属性,并将 mode 属性设置为'NULLABLE'
通过附加加载作业使列可以为 NULLABLE
您可以在向加载作业中的表附加数据时放宽列的模式。 根据文件类型选择以下其中一项:
- 附加 CSV 和 JSON 文件中的数据时,通过指定 JSON 架构文件放宽各个列的模式。
- 附加 Avro、ORC 或 Parquet 文件中的数据时,请将架构中的列放宽为
NULL
,并允许架构推断功能检测已放宽模式的列。
如需在加载作业期间向表附加数据时将列从 REQUIRED
放宽为 NULLABLE
,请选择以下选项之一:
控制台
Google Cloud 控制台不支持放宽列的模式。
bq
使用 bq load
命令加载数据,并指定 --noreplace
标志以表明您要将数据附加到现有表。
如果要附加的数据采用的是 CSV 格式或以换行符分隔的 JSON 格式,请在本地 JSON 架构文件中指定已放宽模式的列,或使用 --autodetect
标志通过架构检测功能来发现源数据中已放宽模式的列。
系统可以根据 Avro、ORC 和 Parquet 文件自动推断已放宽模式的列。列放宽不适用于 Datastore 导出数据附加操作。通过加载 Datastore 导出文件创建的表中的列始终为 NULLABLE
。
将 --schema_update_option
标志设置为 ALLOW_FIELD_RELAXATION
,以表明您要附加的数据包含已放宽的列。
如果要附加的表在非默认项目的数据集中,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET
。
(可选)提供 --location
标志并将其值设置为您的位置。
输入 load
命令,如下所示:
bq --location=LOCATION load \ --noreplace \ --schema_update_option=ALLOW_FIELD_RELAXATION \ --source_format=FORMAT \ PROJECT_ID:DATASET.TABLE \ PATH_TO_SOURCE \ SCHEMA
请替换以下内容:
LOCATION
:您所在位置的名称。--location
是可选标志。例如,如果您在东京区域使用 BigQuery,请将该标志的值设置为asia-northeast1
。您可以使用 .bigqueryrc 文件设置该位置的默认值。FORMAT
:NEWLINE_DELIMITED_JSON
、CSV
、PARQUET
、ORC
或AVRO
。DATASTORE_BACKUP
文件不需要放宽列模式。根据 Datastore 导出文件创建的表中的列始终为NULLABLE
。PROJECT_ID
:您的项目 ID。dataset 是表所属数据集的名称。
TABLE
:要附加的表的名称。PATH_TO_SOURCE
:可以是完全限定的 Cloud Storage URI、以英文逗号分隔的 URI 列表,或指向本地机器上数据文件的路径。SCHEMA
:本地 JSON 架构文件的路径。此选项仅用于 CSV 和 JSON 文件。系统会自动根据 Avro 文件推断出已放宽模式的列。
示例:
输入以下命令可使用加载作业将本地 Avro 数据文件 /tmp/mydata.avro
附加到 mydataset.mytable
。由于系统可以根据 Avro 数据自动推断已放宽的列,因此您无需指定架构文件。mydataset
属于默认项目。
bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--source_format=AVRO \
mydataset.mytable \
/tmp/mydata.avro
输入以下命令,使用加载作业将 Cloud Storage 中以换行符分隔的 JSON 文件中的数据附加到 mydataset.mytable
。已放宽的列所属的架构位于本地 JSON 架构文件 - /tmp/myschema.json
。mydataset
属于默认项目。
bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--source_format=NEWLINE_DELIMITED_JSON \
mydataset.mytable \
gs://mybucket/mydata.json \
/tmp/myschema.json
输入以下命令,使用加载作业将本地机器上 CSV 文件中的数据附加到 mydataset.mytable
。该命令使用架构自动检测功能来发现源数据中已放宽的列。mydataset
属于 myotherproject
,而非默认项目。
bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--source_format=CSV \
--autodetect \
myotherproject:mydataset.mytable \
mydata.csv
API
调用 jobs.insert
方法。配置 load
作业并设置以下属性:
- 使用
sourceUris
属性引用 Cloud Storage 云端存储中的数据。 - 通过设置
sourceFormat
属性来指定数据格式。 - 在
schema
属性中指定架构。 - 使用
schemaUpdateOptions
属性指定架构更新选项。 - 使用
writeDisposition
属性将目标表的写入处置方式设置为WRITE_APPEND
。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
通过附加作业使所有列可以为 NULLABLE
您可以在将查询结果附加到表时放宽表中的所有列。您可以通过将 --schema_update_option
标志设置为 ALLOW_FIELD_RELAXATION
来放宽目标表中的所有必需字段。您无法使用查询附加来放宽目标表中的单个列。如需使用加载附加作业放宽单个列,请参阅通过附加作业使列可以为 NULLABLE
。
如需在将查询结果附加到目标表时放宽所有列,请选择以下选项之一:
控制台
Google Cloud 控制台不支持放宽列的模式。
bq
使用 bq query
命令查询数据,并指定 --destination_table
标志以表明您要附加的表。
如需指定您要将查询结果附加到现有的目标表,请指定 --append_table
标志。
将 --schema_update_option
标志设置为 ALLOW_FIELD_RELAXATION
,以表明您要附加的表中所有的 REQUIRED
列都应更改为 NULLABLE
。
指定 use_legacy_sql=false
标志以使用 GoogleSQL 语法进行查询。
如果要附加的表在非默认项目的数据集中,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET
。
(可选)提供 --location
标志并将其值设置为您的位置。
bq --location=LOCATION query \ --destination_table PROJECT_ID:DATASET.TABLE \ --append_table \ --schema_update_option=ALLOW_FIELD_RELAXATION \ --use_legacy_sql=false \ 'QUERY'
请替换以下内容:
LOCATION
:您所在位置的名称。--location
是可选标志。例如,如果您在东京区域使用 BigQuery,请将该标志的值设置为asia-northeast1
。您可以使用 .bigqueryrc 文件设置该位置的默认值。PROJECT_ID
:您的项目 ID。DATASET
:要附加的表所属数据集的名称。TABLE
:要附加的表的名称。QUERY
:采用 GoogleSQL 语法的查询。
示例:
在默认项目中输入以下命令查询 mydataset.mytable
,以将查询结果附加到 mydataset.mytable2
(也在默认项目中)。该命令将目标表中的所有 REQUIRED
列更改为 NULLABLE
。
bq query \
--destination_table mydataset.mytable2 \
--append_table \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--use_legacy_sql=false \
'SELECT
column1,column2
FROM
mydataset.mytable'
在默认项目中输入以下命令查询 mydataset.mytable
,并将查询结果附加到 myotherproject
中的 mydataset.mytable2
。该命令将目标表中的所有 REQUIRED
列更改为 NULLABLE
。
bq query \
--destination_table myotherproject:mydataset.mytable2 \
--append_table \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--use_legacy_sql=false \
'SELECT
column1,column2
FROM
mydataset.mytable'
API
调用 jobs.insert
方法。配置 query
作业并设置以下属性:
- 使用
destinationTable
属性指定目标表。 - 使用
writeDisposition
属性将目标表的写入处置方式设置为WRITE_APPEND
。 - 使用
schemaUpdateOptions
属性指定架构更新选项。 - 使用
query
属性指定 GoogleSQL 查询。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
更改列的默认值
如需更改列的默认值,请选择以下选项之一:
控制台
在 Google Cloud 控制台中,转到 BigQuery 页面。
在探索器面板中,展开您的项目和数据集,然后选择表。
在详细信息面板中,点击架构标签页。
点击修改架构。您可能需要滚动才能看到此按钮。
在当前架构页面中,找到您要更改的顶级字段。
输入该字段的默认值。
点击保存。
SQL
使用 ALTER COLUMN SET DEFAULT
DDL 语句.
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,输入以下语句:
ALTER TABLE mydataset.mytable ALTER COLUMN column_name SET DEFAULT default_expression;
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
删除列
您可以使用 ALTER TABLE DROP COLUMN
DDL 语句从现有表中删除列。
该语句不会立即释放与丢弃的列关联的存储空间。如需详细了解丢弃列对存储空间的影响,请参阅 ALTER TABLE DROP COLUMN
语句详细信息。您可以通过以下两种方式立即回收存储空间:
- 使用
SELECT * EXCEPT
查询覆盖表。 - 将数据导出到 Cloud Storage,删除不需要的列,然后将数据加载到具有正确架构的新表中。