应用分区和聚类建议

本文档介绍了如何将分区和聚类建议应用于 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-east1us-east5us-south1
  • me-central1me-central2me-west1
  • australia-southeast2
  • southamerica-west1

准备工作

  1. 确保已启用 Recommender API
  2. 确保您拥有所需的 Identity and Access Management (IAM) 权限

应用聚类建议

如需应用聚类建议,您可以将聚类应用于原始表的副本将聚类直接应用于原始表使用具体化视图

将聚类建议应用于复制的表

将聚类建议应用于 BigQuery 表时,您可以先复制原始表,然后再将建议应用于复制的表。此方法可确保在您需要回滚聚类配置的更改时保留原始数据。

您可以使用此方法将聚类建议应用于未分区表和分区表。

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,使用 LIKE 运算符创建一个包含原始表的元数据(包括聚类规范)的空表:

    CREATE TABLE DATASET.COPIED_TABLE
    LIKE DATASET.ORIGINAL_TABLE
    

    请替换以下内容:

    • DATASET:包含该表的数据集的名称,例如 mydataset
    • COPIED_TABLE:复制的表的名称,例如 copy_mytable
    • ORIGINAL_TABLE:原始表的名称,例如 mytable
  3. 在 Google Cloud 控制台中,打开 Cloud Shell Editor。

    激活 Cloud Shell

  4. 在 Cloud Shell Editor 中,使用 bq update 命令更新复制的表的聚类规范以匹配建议的聚类:

     bq update --clustering_fields=CLUSTER_COLUMN DATASET.COPIED_TABLE 

    CLUSTER_COLUMN 替换为您要对其进行聚类的列,例如 mycolumn

    您还可以调用 tables.updatetables.patch API 方法来修改聚类规范

  5. 在查询编辑器中,使用原始表的分区和聚类配置(如果存在任何分区或聚簇)检索表架构。您可以通过查看原始表的 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)
  6. 将数据注入到复制的表中。您使用的过程基于分区类型。

    • 如果原始表未分区或按表列分区,请将原始表中的数据注入到复制的表中:
      INSERT INTO DATASET.COPIED_TABLE
      SELECT * FROM DATASET.ORIGINAL_TABLE
      
    • 如果原始表按注入时间分区,请按照以下步骤操作:

      1. 使用 INFORMATION_SCHEMA.COLUMNS 视图检索列列表,以形成数据注入表达式:

        SELECT
        ARRAY_TO_STRING((
        SELECT
          ARRAY(
          SELECT
            column_name
          FROM
            DATASET.INFORMATION_SCHEMA.COLUMNS
          WHERE
            table_name = 'ORIGINAL_TABLE')), ", ")
        

        输出是一个以英文逗号分隔的列名称列表。

      2. 将原始表中的数据注入到副本表中:

        INSERT DATASET.COPIED_TABLE (COLUMN_NAMES, _PARTITIONTIME)
        SELECT *, _PARTITIONTIME FROM DATASET.ORIGINAL_TABLE
        

        COLUMN_NAMES 替换为上一步中输出的列列表(以英文逗号分隔),例如 col1, col2, col3

    现在,您已有一个与原始表包含相同数据的聚类副本表。在接下来的步骤中,您需要将原始表替换为新聚类的表。

  7. 将原始表重命名为备份表:

    ALTER TABLE DATASET.ORIGINAL_TABLE
    RENAME TO DATASET.BACKUP_TABLE
    

    BACKUP_TABLE 替换为备份表的名称,例如 backup_mytable

  8. 将副本表重命名为原始表:

    ALTER TABLE DATASET.COPIED_TABLE
    RENAME TO DATASET.ORIGINAL_TABLE
    

    原始表现在会根据聚类建议进行聚类。

建议您查看聚类表,以确保所有表函数都按预期运行。许多表函数可能与表 ID 而不是表名称相关联,因此最好先查看以下表函数,然后再继续操作:

如果出现任何问题,您必须手动将受影响的工件迁移到新表。

查看聚类表后,您可以视需要使用以下命令删除备份表:
    DROP TABLE DATASET.BACKUP_TABLE
    

直接应用聚类建议

您可以将聚类建议直接应用于现有 BigQuery 表。此方法比将建议应用于复制的表更快,但不会保留备份表。

按照以下步骤将新的聚簇规范应用于未分区或分区表。

  1. 在 bq 工具中,更新表的聚簇规范以匹配新聚簇:

     bq update --clustering_fields=CLUSTER_COLUMN DATASET.ORIGINAL_TABLE 

    请替换以下内容:

    • CLUSTER_COLUMN:要对其进行聚簇的列,例如 mycolumn
    • DATASET:包含该表的数据集的名称,例如 mydataset
    • ORIGINAL_TABLE:原始表的名称,例如 mytable

    您还可以调用 tables.updatetables.patch API 方法来修改聚类规范

  2. 如需根据新的聚簇规范对所有行进行聚簇,请运行以下 UPDATE 语句:

    UPDATE DATASET.ORIGINAL_TABLE SET CLUSTER_COLUMN=CLUSTER_COLUMN WHERE true
    

使用具体化视图应用聚类建议

您可以创建表的具体化视图来存储应用了建议的原始表中的数据。使用具体化视图应用建议可确保聚类数据通过自动刷新保持最新。在查询、维护和存储具体化视图时,您需要考虑一些价格注意事项。如需了解如何创建聚类具体化视图,请参阅聚类具体化视图

应用分区建议

您可以通过将分区应用于原始表的副本来应用分区建议。

将分区建议应用于复制的表

将分区建议应用于 BigQuery 表时,您可以先复制原始表,然后再将建议应用于复制的表。此方法可确保在您需要回滚分区时保留原始数据。

以下过程使用示例建议按分区时间单位 DAY 对表进行分区。

  1. 使用分区建议创建复制的表:

    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

    如需详细了解如何创建分区表,请参阅创建分区表

  2. 将原始表重命名为备份表:

    ALTER TABLE DATASET.ORIGINAL_TABLE
    RENAME TO DATASET.BACKUP_TABLE
    

    BACKUP_TABLE 替换为备份表的名称,例如 backup_mytable

  3. 将副本表重命名为原始表:

    ALTER TABLE DATASET.COPIED_TABLE
    RENAME TO DATASET.ORIGINAL_TABLE
    

    原始表现在会根据分区建议进行分区。

建议您查看分区表,以确保所有表函数都按预期运行。许多表函数可能与表 ID 而不是表名称相关联,因此最好先查看以下表函数,然后再继续操作:

如果出现任何问题,您必须手动将受影响的工件迁移到新表。

查看分区表后,您可以视需要使用以下命令删除备份表:
    DROP TABLE DATASET.BACKUP_TABLE
    

价格

将建议应用于表时,可能会产生以下费用:

  • 处理费用。 应用建议时,您需要对 BigQuery 项目执行数据定义语言 (DDL) 或数据操纵语言 (DML) 查询。
  • 存储费用。 如果您使用复制表方法,则需要为复制的(或备份)表使用额外的存储空间。

您需要根据与项目关联的结算账号支付标准处理和存储费用。如需了解详情,请参阅 BigQuery 价格