应用分区和聚类建议
本文档介绍了如何将分区和聚类建议应用于 BigQuery 表。
限制
分区和聚类 Recommender 不支持使用旧版 SQL 的 BigQuery 表。生成建议时,Recommender 会在其分析中排除所有旧版 SQL 查询。此外,对使用旧版 SQL 的 BigQuery 表应用分区建议会中断该表中的所有旧版 SQL 工作流。
在应用分区建议之前,请将旧版 SQL 工作流迁移到 GoogleSQL。
分区和聚簇 Recommender 不支持存储在以下区域中的资源:
europe-central2
,europe-west8
,europe-west9
,europe-west12
,europe-north1
,europe-southwest1
us-east1
、us-east5
、us-south1
me-central1
、me-central2
、me-west1
australia-southeast2
southamerica-west1
准备工作
应用聚类建议
如需应用聚类建议,您可以将聚类应用于原始表的副本、将聚类直接应用于原始表或使用具体化视图。
将聚类建议应用于复制的表
将聚类建议应用于 BigQuery 表时,您可以先复制原始表,然后再将建议应用于复制的表。此方法可确保在您需要回滚聚类配置的更改时保留原始数据。
您可以使用此方法将聚类建议应用于未分区表和分区表。
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,使用
LIKE
运算符创建一个包含原始表的元数据(包括聚类规范)的空表:CREATE TABLE DATASET.COPIED_TABLE LIKE DATASET.ORIGINAL_TABLE
请替换以下内容:
DATASET
:包含该表的数据集的名称,例如mydataset
COPIED_TABLE
:复制的表的名称,例如copy_mytable
ORIGINAL_TABLE
:原始表的名称,例如mytable
在 Google Cloud 控制台中,打开 Cloud Shell Editor。
在 Cloud Shell Editor 中,使用
bq update
命令更新复制的表的聚类规范以匹配建议的聚类:bq update --clustering_fields=CLUSTER_COLUMN DATASET.COPIED_TABLE
将
CLUSTER_COLUMN
替换为您要对其进行聚类的列,例如mycolumn
。您还可以调用
tables.update
或tables.patch
API 方法来修改聚类规范。在查询编辑器中,使用原始表的分区和聚类配置(如果存在任何分区或聚簇)检索表架构。您可以通过查看原始表的
INFORMATION_SCHEMA.TABLES
视图来检索架构:SELECT ddl FROM DATASET.INFORMATION_SCHEMA.TABLES WHERE table_name = 'DATASET.ORIGINAL_TABLE;'
输出是 ORIGINAL_TABLE 的完整数据定义语言 (DDL) 语句,包括
PARTITION BY
子句。如需详细了解 DDL 输出中的参数,请参阅CREATE TABLE
语句。DDL 输出指示原始表中的分区类型:
分区类型 输出示例 未分区 PARTITION BY
子句不存在。按表列分区 PARTITION BY c0
PARTITION BY DATE(c0)
PARTITION BY DATETIME_TRUNC(c0, MONTH)
按注入时间分区 PARTITION BY _PARTITIONDATE
PARTITION BY DATETIME_TRUNC(_PARTITIONTIME, MONTH)
将数据注入到复制的表中。您使用的过程基于分区类型。
- 如果原始表未分区或按表列分区,请将原始表中的数据注入到复制的表中:
INSERT INTO DATASET.COPIED_TABLE SELECT * FROM DATASET.ORIGINAL_TABLE
如果原始表按注入时间分区,请按照以下步骤操作:
使用
INFORMATION_SCHEMA.COLUMNS
视图检索列列表,以形成数据注入表达式:SELECT ARRAY_TO_STRING(( SELECT ARRAY( SELECT column_name FROM DATASET.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'ORIGINAL_TABLE')), ", ")
输出是一个以英文逗号分隔的列名称列表。
将原始表中的数据注入到副本表中:
INSERT DATASET.COPIED_TABLE (COLUMN_NAMES, _PARTITIONTIME) SELECT *, _PARTITIONTIME FROM DATASET.ORIGINAL_TABLE
将
COLUMN_NAMES
替换为上一步中输出的列列表(以英文逗号分隔),例如col1, col2, col3
。
现在,您已有一个与原始表包含相同数据的聚类副本表。在接下来的步骤中,您需要将原始表替换为新聚类的表。
- 如果原始表未分区或按表列分区,请将原始表中的数据注入到复制的表中:
将原始表重命名为备份表:
ALTER TABLE DATASET.ORIGINAL_TABLE RENAME TO DATASET.BACKUP_TABLE
将
BACKUP_TABLE
替换为备份表的名称,例如backup_mytable
。将副本表重命名为原始表:
ALTER TABLE DATASET.COPIED_TABLE RENAME TO DATASET.ORIGINAL_TABLE
原始表现在会根据聚类建议进行聚类。
- 访问权限和权限,例如 IAM 权限、行级访问权限或列级访问权限。
- 表工件,例如表克隆、表快照或搜索索引。
- 任何正在进行的表进程(例如复制表时运行的任何具体化视图或任何作业)的状态。
- 能够使用时间旅行访问历史表数据。
- 与原始表关联的任何元数据,例如
table_option_list
或column_option_list
。 如需了解详情,请参阅数据定义语言语句。
如果出现任何问题,您必须手动将受影响的工件迁移到新表。
查看聚类表后,您可以视需要使用以下命令删除备份表:DROP TABLE DATASET.BACKUP_TABLE
直接应用聚类建议
您可以将聚类建议直接应用于现有 BigQuery 表。此方法比将建议应用于复制的表更快,但不会保留备份表。
按照以下步骤将新的聚簇规范应用于未分区或分区表。
在 bq 工具中,更新表的聚簇规范以匹配新聚簇:
bq update --clustering_fields=CLUSTER_COLUMN DATASET.ORIGINAL_TABLE
请替换以下内容:
CLUSTER_COLUMN
:要对其进行聚簇的列,例如mycolumn
DATASET
:包含该表的数据集的名称,例如mydataset
ORIGINAL_TABLE
:原始表的名称,例如mytable
您还可以调用
tables.update
或tables.patch
API 方法来修改聚类规范。如需根据新的聚簇规范对所有行进行聚簇,请运行以下
UPDATE
语句:UPDATE DATASET.ORIGINAL_TABLE SET CLUSTER_COLUMN=CLUSTER_COLUMN WHERE true
使用具体化视图应用聚类建议
您可以创建表的具体化视图来存储应用了建议的原始表中的数据。使用具体化视图应用建议可确保聚类数据通过自动刷新保持最新。在查询、维护和存储具体化视图时,您需要考虑一些价格注意事项。如需了解如何创建聚类具体化视图,请参阅聚类具体化视图。应用分区建议
您可以通过将分区应用于原始表的副本来应用分区建议。
将分区建议应用于复制的表
将分区建议应用于 BigQuery 表时,您可以先复制原始表,然后再将建议应用于复制的表。此方法可确保在您需要回滚分区时保留原始数据。
以下过程使用示例建议按分区时间单位 DAY
对表进行分区。
使用分区建议创建复制的表:
CREATE TABLE DATASET.COPIED_TABLE PARTITION BY DATE_TRUNC(PARTITION_COLUMN, DAY) AS SELECT * FROM DATASET.ORIGINAL_TABLE
请替换以下内容:
DATASET
:包含该表的数据集的名称,例如mydataset
COPIED_TABLE
:复制的表的名称,例如copy_mytable
PARTITION_COLUMN
:要对其进行分区的列,例如mycolumn
如需详细了解如何创建分区表,请参阅创建分区表。
将原始表重命名为备份表:
ALTER TABLE DATASET.ORIGINAL_TABLE RENAME TO DATASET.BACKUP_TABLE
将
BACKUP_TABLE
替换为备份表的名称,例如backup_mytable
。将副本表重命名为原始表:
ALTER TABLE DATASET.COPIED_TABLE RENAME TO DATASET.ORIGINAL_TABLE
原始表现在会根据分区建议进行分区。
- 访问权限和权限,例如 IAM 权限、行级访问权限或列级访问权限。
- 表工件,例如表克隆、表快照或搜索索引。
- 任何正在进行的表进程(例如复制表时运行的任何具体化视图或任何作业)的状态。
- 能够使用时间旅行访问历史表数据。
- 与原始表关联的任何元数据,例如
table_option_list
或column_option_list
。 如需了解详情,请参阅数据定义语言语句。 - 能够使用旧版 SQL 将查询结果写入分区表中。分区表不完全支持使用旧版 SQL。一种解决方案是在应用分区建议之前将旧版 SQL 工作流迁移到 GoogleSQL。
如果出现任何问题,您必须手动将受影响的工件迁移到新表。
查看分区表后,您可以视需要使用以下命令删除备份表:DROP TABLE DATASET.BACKUP_TABLE
价格
将建议应用于表时,可能会产生以下费用:
- 处理费用。 应用建议时,您需要对 BigQuery 项目执行数据定义语言 (DDL) 或数据操纵语言 (DML) 查询。
- 存储费用。 如果您使用复制表方法,则需要为复制的(或备份)表使用额外的存储空间。
您需要根据与项目关联的结算账号支付标准处理和存储费用。如需了解详情,请参阅 BigQuery 价格。