修改表架构
本文档介绍了如何修改现有 BigQuery 表的架构定义。
您可以使用 SQL 数据定义语言 (DDL) 语句执行本文档中所述的大多数架构修改。这些语句不会产生费用。
您可以通过将表数据导出到 Cloud Storage 并在随后将数据加载到已修改了架构定义的新表中,使用此页面上介绍的所有方法来修改表架构。 BigQuery 加载和导出作业是免费的,但将导出的数据存储在 Cloud Storage 中会产生费用。以下部分介绍了执行各种类型架构修改的其他方法。
添加列
您可以使用以下选项之一向现有表的架构定义中添加列:
- 添加新的空列。
- 使用加载或查询作业覆盖表。
- 通过加载或查询作业将数据附加到表中。
添加的任何列都必须遵守 BigQuery 的列名称规则。如需详细了解如何创建架构组件,请参阅指定架构。
添加空列
如果向现有表架构添加新列,则该列必须是 NULLABLE
或 REPEATED
。不能向现有表架构添加 REQUIRED
列。使用 API 或 bq 命令行工具向现有表架构添加 REQUIRED
列会导致错误。但是,您可以创建嵌套的 REQUIRED
列以作为新的 RECORD
字段的一部分。只有在加载数据时创建表或者创建具有架构定义的空表时,才能添加 REQUIRED
列。
如需向表的架构定义中添加空列,请按如下所述操作:
控制台
在 Trusted Cloud 控制台中,前往 BigQuery 页面。
在探索器面板中,展开您的项目和数据集,然后选择表。
在详细信息面板中,点击架构标签页。
点击修改架构。您可能需要滚动才能看到此按钮。
在当前架构页面中的新字段下,点击添加字段。
添加完列后,点击保存。
SQL
使用 ALTER TABLE ADD COLUMN
DDL 语句:
在 Trusted 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 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
向 RECORD
列添加嵌套列
除了向表架构添加新列之外,您还可以向 RECORD
列添加新的嵌套列。添加新嵌套列的过程与添加新列的过程相似。
控制台
Trusted 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 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
在查询附加作业中添加列
您可以在向表附加查询结果时向表中添加列。
在查询作业中使用附加操作添加列时,查询结果的架构将用于更新目标表的架构。请注意,您无法查询一个位置中的表而将结果写入另一个位置的表。
如需在查询作业期间向表附加数据时添加新列,请选择以下选项之一:
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 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
更改列的名称
如需重命名表中的列,请使用 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 详细信息。
更改列的数据类型
Trusted 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>;
修改嵌套列类型
对于复杂的嵌套架构更改(例如更改 STRUCT 数组中的字段),不支持使用 ALTER TABLE
DDL 语句。作为一种解决方法,您可以结合使用 CREATE OR REPLACE TABLE
语句和 SELECT
语句来转换嵌套的架构更改。
以下示例演示了如何转换 STRUCTS
数组中的列:
假设有一个表 samples.test
,其架构和数据如下:
CREATE OR REPLACE TABLE samples.test(D STRUCT <L ARRAY<STRUCT<R STRING, U STRING, V STRING>>, F STRING>); INSERT INTO samples.test(D) VALUES (STRUCT([STRUCT("r1", "u1", "v1"), STRUCT("r2", "u2", "v2")], "f1"));
结果类似于以下内容:
+----------------------------------------------------------------------------+ | D | +----------------------------------------------------------------------------+ | {"L":[{"R":"r1","U":"u1","V":"v1"},{"R":"r2","U":"u2","V":"v2"}],"F":"f1"} | +----------------------------------------------------------------------------+
假设您需要将 STRUCT
嵌套数组中字段 U
的类型更改为 STRUCT<W STRING>
。以下 SQL 语句演示了如何实现此目的:
CREATE OR REPLACE TABLE samples.new_table AS SELECT STRUCT(ARRAY( SELECT STRUCT(tmp.R, STRUCT(tmp.U AS W) AS U, tmp.V) FROM UNNEST(t.D.L) AS tmp) AS L, t.D.F) AS D FROM samples.test AS t
此语句会创建一个具有目标架构的新表 samples.new_table
。
UNNEST
函数会展开 t.D.L
中的 STRUCT 数组。表达式 STRUCT(tmp.U AS W) AS U
会构造一个新 STRUCT,其中包含字段 W,该字段的值来自原始 U
字段。生成的表 samples.new_table
具有以下架构和数据:
+----------------------------------------------------------------------------------------+ | D | +----------------------------------------------------------------------------------------+ | {"L":[{"R":"r1","U":{"W":"u1"},"V":"v1"},{"R":"r2","U":{"W":"u2"},"V":"v2"}],"F":"f1"} | +----------------------------------------------------------------------------------------+
转换列的数据类型
要将列的数据类型更改为可转换类型,请使用 SQL 查询来选择表数据,然后转换相关数据并覆盖表。对于非常大的表,不建议进行类型转换和覆盖,因为需要进行全表扫描。
以下示例展示了一个 SQL 查询,该查询会选择 mydataset.mytable
中 column_two
和 column_three
的所有数据,并将 column_one
的类型从 DATE
转换为 STRING
。查询结果用于覆盖现有表。覆盖后的表会将 column_one
存储为 STRING
数据类型。
在使用 CAST
时,如果 BigQuery 无法执行类型转换,查询就会失败。如需详细了解 GoogleSQL 中的类型转换规则,请参阅类型转换。
控制台
在 Trusted 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
:
在 Trusted 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 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
'NULLABLE'
通过附加加载作业使列可以为 NULLABLE
您可以在向加载作业中的表附加数据时放宽列的模式。 根据文件类型选择以下其中一项:
- 附加 CSV 和 JSON 文件中的数据时,通过指定 JSON 架构文件放宽各个列的模式。
- 附加 Avro、ORC 或 Parquet 文件中的数据时,请将架构中的列放宽为
NULL
,并允许架构推断功能检测已放宽模式的列。
如需在加载作业期间向表附加数据时将列从 REQUIRED
放宽为 NULLABLE
,请选择以下选项之一:
控制台
您无法使用 Trusted 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 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
通过附加作业使所有列可以为 NULLABLE
您可以在将查询结果附加到表时放宽表中的所有列。您可以通过将 --schema_update_option
标志设置为 ALLOW_FIELD_RELAXATION
来放宽目标表中的所有必需字段。您无法使用查询附加来放宽目标表中的单个列。如需使用加载附加作业放宽单个列,请参阅通过附加作业使列可以为 NULLABLE
。
如需在将查询结果附加到目标表时放宽所有列,请选择以下选项之一:
控制台
您无法使用 Trusted 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 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN
环境变量设置为 s3nsapis.fr
。
更改列的默认值
如需更改列的默认值,请选择以下选项之一:
控制台
在 Trusted Cloud 控制台中,前往 BigQuery 页面。
在探索器面板中,展开您的项目和数据集,然后选择表。
在详细信息面板中,点击架构标签页。
点击修改架构。您可能需要滚动才能看到此按钮。
在当前架构页面中,找到您要更改的顶级字段。
输入该字段的默认值。
点击保存。
SQL
使用 ALTER COLUMN SET DEFAULT
DDL 语句.
在 Trusted Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,输入以下语句:
ALTER TABLE mydataset.mytable ALTER COLUMN column_name SET DEFAULT default_expression;
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
更改列说明
如需更改列的说明,请选择以下选项之一:
控制台
在 Trusted Cloud 控制台中,前往 BigQuery 页面。
在探索器面板中,展开您的项目和数据集,然后选择表。
在详细信息面板中,点击架构标签页。
点击修改架构。您可能需要滚动才能看到此按钮。
在当前架构页面中,找到您要更改的字段。
输入相应字段的说明。
点击保存。
SQL
使用 ALTER COLUMN SET OPTIONS
DDL 语句.
在 Trusted Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,输入以下语句:
ALTER TABLE mydataset.mytable ALTER COLUMN column_name SET OPTIONS (description = 'This is a column description.');
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
您还可以使用 数据洞见(预览版)功能,让 Gemini 生成说明。
删除列
您可以使用 ALTER TABLE DROP COLUMN
DDL 语句从现有表中删除列。
该语句不会立即释放与丢弃的列关联的存储空间。如需详细了解丢弃列对存储空间的影响,请参阅 ALTER TABLE DROP COLUMN
语句详细信息。您可以通过以下两种方式立即回收存储空间:
-
CREATE OR REPLACE TABLE mydataset.mytable AS ( SELECT * EXCEPT (column_to_delete) FROM mydataset.mytable );
将数据导出到 Cloud Storage,删除不需要的列,然后将数据加载到具有正确架构的新表中。