创建和使用提取时间分区表

本文档介绍如何在 BigQuery 中创建和使用按数据提取时间分区的表(在下文中称为“提取时间分区表”)。如需了解分区表,请参阅创建和使用分区表

创建提取时间分区表后,您可以执行以下操作:

  • 控制对表数据的访问权限
  • 获取有关分区表的信息
  • 列出数据集中的分区表
  • 使用元表获取分区表元数据

如需详细了解如何管理分区表,包括更新分区表属性、复制分区表和删除分区表,请参阅管理分区表

创建提取时间分区表

通过以下方法可以在 BigQuery 中创建提取时间分区表:

  • 使用带有 partition_expression 的 DDL CREATE TABLE 语句
  • 使用 GCP Console 或经典版 BigQuery 网页界面手动创建
  • 使用命令行工具的 bq mk 命令
  • 调用 tables.insert API 方法以编程方式创建
  • 通过使用客户端库创建
  • 基于查询结果
  • 在加载数据时创建
  • 将日期分片表转换为分区表

表命名

在 BigQuery 中创建表时,数据集中每个表的名称都必须具有唯一性。表名称可:

  • 包含最多 1024 个字符
  • 包含字母(大写或小写)、数字和下划线

所需权限

如需创建表,您至少必须具有以下权限:

  • bigquery.tables.create:创建表的权限
  • bigquery.tables.updateData:使用加载作业、查询作业或复制作业向表中写入数据
  • bigquery.jobs.create:运行将数据写入表的查询作业、加载作业或复制作业

如需访问写入表中的数据,可能还需要其他权限,例如 bigquery.tables.getData

以下预定义的 Cloud IAM 角色包含 bigquery.tables.createbigquery.tables.updateData 权限:

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

以下预定义的 Cloud IAM 角色包含 bigquery.jobs.create 权限:

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

此外,如果用户具有 bigquery.datasets.create 权限,则当该用户创建数据集时,系统会为其授予该数据集的 bigquery.dataOwner 访问权限。 借助 bigquery.dataOwner 访问权限,用户可以在数据集中创建和更新表。

如需详细了解 BigQuery 中的 Cloud IAM 角色和权限,请参阅预定义的角色和权限

使用架构定义来创建空的提取时间分区表

在使用架构定义来创建空的时间分区表时,可执行以下操作:

  • 使用 GCP Console 或经典版 BigQuery 网页界面输入架构
  • 使用命令行工具以内嵌方式提供架构
  • 使用命令行工具提交 JSON 架构文件
  • 调用 API 的 tables.insert 方法时,在表资源中提供架构。

如需详细了解如何指定表架构,请参阅指定架构

创建时间分区表后,您可以执行下列操作:

  • 向其中加载数据
  • 向其中写入查询结果
  • 向其中复制数据

如需使用架构定义来创建空的时间分区表,请执行以下操作:

控制台

  1. 从导航面板的资源部分选择数据集。 点击窗口右侧的创建表创建表
  2. 创建表页面的来源部分,选择创建空表
  3. 创建表格页面的目标位置部分,执行以下操作:

    • 数据集名称部分,选择相应的数据集。 选择数据集

    • 表名称字段中,输入您要在 BigQuery 中创建的表的名称。

    • 确认表类型设置为原生表

  4. 架构部分中,输入架构定义。

    • 通过以下方式,手动输入架构信息:

      • 启用以文本形式修改,并以 JSON 数组格式输入表架构。

      • 使用添加字段手动输入架构。

  5. 分区和聚簇设置部分中,执行以下操作:

    • 分区部分,点击不进行分区并选择按提取时间分区按提取时间分区
  6. (可选)在分区过滤条件中,点击需要分区过滤条件框,以要求用户添加 WHERE 子句来指定要查询的分区。需要分区过滤条件有可能减少费用并提高性能。如需了解详情,请参阅查询分区表

  7. (可选)点击高级选项,然后在加密部分中点击客户管理的密钥,以使用 Cloud Key Management Service 密钥。如果保留 Google 管理的密钥设置,BigQuery 将对静态数据进行加密

  8. 点击创建表

创建表后,您可以更新分区表的表过期时间说明标签。在使用 BigQuery 网页界面创建表后,无法添加分区过期时间。

经典版界面

  1. 在导航窗格中,点击数据集名称旁边的向下箭头图标 向下箭头图标,然后点击 Create new table

  2. Create Table 页面上的 Source Data 部分中,点击 Create empty table

  3. Create Table 页面的 Destination Table 部分,执行以下操作:

    • 对于 Table name,选择相应的数据集,然后在表名称字段中输入要创建的表的名称。
    • 确认 Table type 设置为 Native table
  4. Schema 部分中,手动输入架构定义

    • 可通过以下方式手动输入架构信息:

      • 点击 Edit as text,并以 JSON 数组格式输入表架构:

        以 JSON 数组格式添加架构

      • 使用 Add Field 输入架构:

        使用添加字段添加架构

  5. Options 部分,执行以下操作:

  6. 点击创建表

创建表后,您可以更新分区表的表过期时间说明标签。在使用 BigQuery 网页界面创建表后,无法添加分区过期时间。

CLI

mk 命令与 --table 标志(或 -t 快捷方式)和 --time_partitioning_type=DAY 标志配合使用。DAY--time_partitioning_type 当前唯一支持的值。您可以内嵌方式或通过 JSON 架构文件提供表的架构定义。可选参数包括 --expiration--description--time_partitioning_expiration--destination_kms_key--label。如果要在非默认项目中创建表,请按以下格式将项目 ID 添加到数据集:project_id:dataset

此处未演示 --destination_kms_key。如需详细了解如何使用此标志,请参阅使用 Cloud KMS 密钥保护数据

输入以下命令可使用架构定义来创建空的提取时间分区表:

bq mk --table \
--expiration integer1 \
--time_partitioning_type=DAY \
--time_partitioning_expiration integer2 \
--description "description" \
-label key:value,key:value \
project_id:dataset.table \
schema

其中:

  • integer1 是表的默认生命周期(以秒为单位)。最小值为 3600 秒(一小时)。到期时间以当前世界协调时间 (UTC) 加上这个整数值为准。如果您在创建分区表时设置了该表的过期时间,则系统会忽略数据集的默认表过期时间设置。如果设置了此值,系统将在指定的时间后删除表和所有分区。
  • integer2 是表分区的默认生命周期(以秒为单位)。它没有最小值。过期时间以分区的日期加上这个整数值为准。分区过期时间虽然与表的过期时间无关,但它不会替换表的过期时间。如果设置的分区过期时间超过了表的过期时间,则以表过期时间为准。
  • description 是带有英文引号的表说明
  • key:value 是代表标签的键值对。可使用英文逗号分隔列表输入多个标签。
  • project_id 是您的项目 ID。
  • dataset 是项目中的数据集。
  • table 是您正在创建的时间分区表的名称。
  • schema 是 column:data_type,column:data_type 格式的内嵌架构定义或本地机器上的 JSON 架构文件的路径。

使用命令行指定架构时,您不能添加 RECORD (STRUCT) 类型和列说明,也不能指定列的模式。所有模式均默认为 NULLABLE。如需添加说明、模式和 RECORD 类型,请改为提供 JSON 架构文件

示例:

输入以下命令,在默认项目的 mydataset 中创建一个名为 mytable 的提取时间分区表。分区过期时间设为 259200 秒(3 天),表的过期时间设为 2592000(1 个月/30 天),说明设为 This is my time-partitioned table,标签设为 organization:development。该命令使用 -t 快捷方式代替 --table。该架构以内嵌方式指定为:qtr:STRING,sales:FLOAT,year:STRING

bq mk -t \
--expiration 2592000 \
--time_partitioning_type=DAY \
--time_partitioning_expiration 259200 \
--description "This is my time-partitioned table" \
--label organization:development \
mydataset.mytable \
qtr:STRING,sales:FLOAT,year:STRING

输入以下命令,在 myotherproject 而不是默认项目中创建一个名为 mytable 的时间分区表。分区过期时间设为 259200 秒(3天),说明设为 This is my time-partitioned table,标签设为 organization:development。该命令使用 -t 快捷方式代替 --table。该命令不指定表过期时间。如果数据集具有默认的表过期时间,则应用该时间。如果数据集没有默认的表过期时间,则表将永远不会过期,但分区将在 3 天后过期。指向架构文件的路径为 /tmp/myschema.json

bq mk -t \
--time_partitioning_type=DAY \
--time_partitioning_expiration 259200 \
--description "This is my time-partitioned table" \
--label organization:development \
myotherproject:mydataset.mytable \
/tmp/myschema.json

创建表后,您可以更新提取时间分区表的表过期时间分区过期时间说明标签

API

使用指定了 timePartitioning 属性和 schema 属性的已定义表资源调用 tables.insert 方法。

根据查询结果创建提取时间分区表

如需根据查询结果创建分区表,请将结果写入新目标表中。可通过查询分区表或非分区表来创建新的分区表。不能使用查询结果将现有表更改为分区表。

如需详细了解如何查询时间分区表,请参阅查询分区表

控制台

使用 Console BigQuery 网页界面查询数据时,您无法为目标表指定分区选项。

经典版界面

使用经典版 BigQuery 网页界面查询数据时,您无法为目标表指定分区选项。

CLI

输入 bq query 命令,指定 --destination_table 标志可基于查询结果创建一个永久表,指定 --time_partitioning_type=DAY 标志可创建提取时间分区目标表。DAY--time_partitioning_type 当前唯一支持的值。

指定 use_legacy_sql=false 标志可使用标准 SQL 语法。如需将查询结果写入非默认项目中的某个表,请按此格式将相应项目 ID 添加到数据集名称中:project_id:dataset

(可选)添加 --location 标志并将其值设置为您的位置

输入以下命令可根据查询结果创建一个新的提取时间分区目标表:

bq --location=location query \
--destination_table project_id:dataset.table \
--time_partitioning_type=DAY \
--use_legacy_sql=false \
'query'

其中:

  • location 是您位置的名称--location 是可选标志。例如,如果您在东京区域使用 BigQuery,可将该标志的值设置为 asia-northeast1。您可以使用 .bigqueryrc 文件设置该位置的默认值。
  • project_id 是您的项目 ID。
  • dataset 是将包含新时间分区表的数据集的名称。
  • table 是您正在使用查询结果创建的时间分区表的名称。
  • query 是使用标准 SQL 语法的查询。

示例:

输入以下命令可将查询结果写入 mydataset 中名为 mytable 的提取时间分区目标表。该数据集在默认项目中。该查询从非分区表(美国名字数据公共数据集)中检索数据。

bq query \
--destination_table mydataset.mytable \
--time_partitioning_type=DAY \
--use_legacy_sql=false \
'SELECT
   name,
   number
 FROM
   `bigquery-public-data`.usa_names.usa_1910_current
 WHERE
   gender = "M"
 ORDER BY
   number DESC'

输入以下命令可将查询结果写入 mydataset 中名为 mytable 的提取时间分区目标表。该数据集在 myotherproject 中,不在默认项目中。该查询从非分区表(美国名字数据公共数据集)中检索数据。

bq query \
--destination_table myotherproject:mydataset.mytable \
--time_partitioning_type=DAY \
--use_legacy_sql=false \
'SELECT
   name,
   number
 FROM
   `bigquery-public-data`.usa_names.usa_1910_current
 WHERE
   gender = "M"
 ORDER BY
   number DESC'

API

如需将查询结果保存到永久提取时间分区表中,请调用 jobs.insert 方法,配置一项 query 作业,并为 destinationTabletimePartitioning 属性添加值。

在加载数据时创建提取时间分区表

在将数据加载到新表中时,可以通过指定分区选项来创建提取时间分区表。您无需在加载数据前专门创建空的分区表,而是可以同时创建分区表并加载数据。

在将数据加载到 BigQuery 中时,可以提供表架构,或者对于支持的数据格式,可以使用架构自动检测

通过分区装饰器 (Partition decorator),您可以将数据加载到特定分区。如需针对时区进行调整,请根据您的首选时区使用分区装饰器将数据加载到分区中。例如,如果您使用的是太平洋标准时间 (PST),请使用以下相应分区装饰器将太平洋标准时间 2016 年 5 月 1 日生成的所有数据加载到该日期的分区中:

table_name$20160501

如需详细了解如何加载数据,请参阅将数据加载到 BigQuery 简介

将日期分片表转换为提取时间分区表

如果以前创建了日期分片表,则可以使用 bq 命令行工具中的 partition 命令将整套相关表转换为单个提取时间分区表。日期分片表必须使用以下命名约定:table_YYYYMMDD。例如,mytable_20160101、...、mytable_20160331

可选参数包括 --time_partitioning_expiration--location--time_partitioning_type。由于 --time_partitioning_type=DAY 是目前唯一支持的值,因此该参数为可选项。如果源表或目标表在非默认项目中,请按以下格式将项目 ID 添加到数据集名称:project_id:dataset

输入以下命令可将一系列日期分片表转换为单个提取时间分区表:

bq --location=location partition \
--time_partitioning_type=DAY \
--time_partitioning_expiration integer \
project_id:dataset.source_table_ \
project_id:dataset.destination_table

其中:

  • location 是您位置的名称--location 是可选标志。例如,如果您在东京区域使用 BigQuery,请将该标志的值设为 asia-northeast1。您可以使用 .bigqueryrc 文件设置位置的默认值。
  • integer 是表分区的默认生命周期(以秒为单位)。它没有最小值。过期时间以分区的世界协调时间 (UTC) 日期加上这个整数值为准。分区过期时间虽然与表的过期时间无关,但它不会替换表的过期时间。如果设置的分区过期时间超过了表的过期时间,则以表过期时间为准。
  • project_id 是您的项目 ID。
  • dataset 是项目中的数据集。
  • sourcetable 是日期分片表的前缀。
  • destination_table 是您正在创建的分区表的名称。

示例:

输入以下命令可在默认项目的 mydataset 中创建一个名为 mytable_partitioned 的提取时间分区表。分区过期时间设为 259200 秒(3 天)。日期分片源表的前缀为 sourcetable_。源表也在默认项目中。

bq partition \
--time_partitioning_type=DAY \
--time_partitioning_expiration 259200 \
mydataset.sourcetable_ \
mydataset.mytable_partitioned

运行该命令时,会创建一个根据分片表生成分区的复制作业。例如,如果日期分片表为 sourcetable_20180126sourcetable_20180127,复制作业将创建以下分区:mydataset.mytable_partitioned$20180126mydataset.mytable_partitioned$20180127

输入以下命令可在 mydataset 中创建一个名为 mytable_partitioned 的提取时间分区表。mydatasetmyotherproject 中,不在默认项目中。分区过期时间设为 86400 秒(1 天)。日期分片源表的前缀为 sourcetable_。源表在默认项目中。

bq partition \
--time_partitioning_type=DAY \
--time_partitioning_expiration 86400 \
mydataset.sourcetable_ \
myotherproject:mydataset.mytable_partitioned

输入以下命令可在默认项目的 mydataset 中创建名为 mytable_partitioned 的提取时间分区表。mydataset 创建于 asia-northeast1 区域。分区过期时间设为 259200 秒(3 天)。日期分片源表的前缀为 sourcetable_。源表也在默认项目中。

bq --location=asia-northeast1 partition \
--time_partitioning_type=DAY \
--time_partitioning_expiration 259200 \
mydataset.sourcetable_ \
mydataset.mytable_partitioned

控制对时间分区表的访问权限

您不能直接分配对表或分区的访问权限控制,但可以通过在数据集级别或更高级别配置访问权限控制来控制表的访问权限。

您可以分配预定义的 Cloud IAM 角色(用于在项目级层或更高级层授予权限),而不是授予对个别数据集的访问权限。

您还可以创建自定义角色。如果创建自定义角色,则您授予的权限取决于您希望用户、群组或服务帐号能够执行的表操作。

如需详细了解角色和权限,请参阅:

使用提取时间分区表

获取有关提取时间分区表的信息

您可以通过以下方式来获取有关表的信息:

  • 使用 GCP Console 或经典版 BigQuery 网页界面
  • 使用 bq show CLI 命令
  • 调用 tables.get API 方法
  • 使用客户端库

所需权限

如需获取有关表的信息,您至少必须具有 bigquery.tables.get 权限。以下预定义的 Cloud IAM 角色包含 bigquery.tables.get 权限:

  • bigquery.metadataViewer
  • bigquery.dataViewer
  • bigquery.dataOwner
  • bigquery.dataEditor
  • bigquery.admin

此外,如果用户具有 bigquery.datasets.create 权限,则当该用户创建数据集时,系统会为其授予该数据集的 bigquery.dataOwner 访问权限。 借助 bigquery.dataOwner 访问权限,用户可以获取数据集中表的信息。

如需详细了解 BigQuery 中的 Cloud IAM 角色和权限,请参阅预定义的角色和权限

获取提取时间分区表信息

如需查看有关提取时间分区表的信息,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 在导航面板的资源部分,展开项目并选择一个数据集,以列出其中包含的表和视图。

  3. 点击表名称。

  4. 点击详细信息。此标签页会显示表说明和表信息。

    表详细信息

  5. 点击架构标签页以查看表的架构定义。请注意附加的伪列 _PARTITIONTIME,其中包含加载到表中的数据的时间戳(基于日期)。

经典版界面

  1. 在导航窗格中,点击数据集左侧的向下箭头图标 向下箭头图标 以展开该数据集,或双击数据集名称。此时会显示数据集中的表和视图。

  2. 点击表名称。

  3. 点击 DetailsTable Details 页面会显示表说明和表信息。

    分区表详细信息

  4. 点击 Schema 标签页查看表的架构定义。请注意附加的伪列 _PARTITIONTIME,其中包含加载到表中的数据的时间戳(基于日期)。

    分区表架构

CLI

发出 bq show 命令可显示所有表信息。使用 --schema 标志可仅显示表的架构信息。--format 标志可用于控制输出。

如果您要获取非默认项目中的表的相关信息,请按以下格式将相应项目 ID 添加到数据集:project_id:dataset

bq show --schema --format=prettyjson <var>project_id:dataset.table</var>

其中:

  • project_id 是您的项目 ID
  • dataset 是数据集的名称。
  • table 是表的名称

示例:

输入以下命令可显示 mydataset 中有关 mytable 的所有信息。mydataset 在默认项目中。

bq show --format=prettyjson mydataset.mytable

输入以下命令可显示 mydataset 中有关 mytable 的所有信息。mydatasetmyotherproject 中,不在默认项目中。

bq show --format=prettyjson myotherproject:mydataset.mytable

输入以下命令仅显示 mydataset 中有关 mytable 的架构信息。mydatasetmyotherproject 中,不在默认项目中。

在显示时间分区表的架构信息时,不会显示 _PARTITIONTIME 伪列。

bq show --schema --format=prettyjson myotherproject:mydataset.mytable

API

调用 bigquery.tables.get 方法并提供所有相关参数。

列出数据集中的提取时间分区表

如需列出数据集中的表(包括分区表),您可以使用 GCP Console、经典版 BigQuery 网页界面或 bq ls CLI 命令,也可以调用 tables.list API 方法。

所需权限

如需列出数据集中的视图,您至少必须拥有 bigquery.tables.list 权限。以下预定义的 Cloud IAM 角色包含 bigquery.tables.list 权限:

  • bigquery.user
  • bigquery.metadataViewer
  • bigquery.dataViewer
  • bigquery.dataOwner
  • bigquery.dataEditor
  • bigquery.admin

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅预定义的角色和权限

列出分区表

如需列出数据集中的表(包括分区表),请按如下所述操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 在导航面板的资源部分中,展开项目并点击数据集。

  3. 滚动列表,查看数据集中的表。表、分区表、模型和视图由不同的图标进行标识。

经典版界面

  1. 在网页界面的导航窗格中,点击数据集左侧的向下箭头图标 向下箭头图标 以展开该数据集,或双击数据集名称。此时会显示数据集中的表和视图。

  2. 滚动列表,查看数据集中的表。表和视图由不同的图标进行标识。

    查看表

CLI

发出 bq ls 命令。--format 标志可用于控制输出。如果您要在非默认项目中列出表,请按以下格式将相应项目 ID 添加到数据集中:project_id:dataset

bq ls --format=pretty project_id:dataset

其中:

  • project_id 是您的项目 ID
  • dataset 是数据集的名称。

运行该命令时,Type 字段会显示 TABLEVIEW。对于提取时间分区表,Time Partitioning 字段会显示以毫秒为单位的 DAY 和分区过期时间(如果有)。

例如:

+-------------------------+-------+----------------------+--------------------------------+
|         tableId         | Type  |        Labels        | Time Partitioning              |
+-------------------------+-------+----------------------+--------------------------------+
| mytable                 | TABLE | department:shipping  |  DAY (expirationMs: 259200000) |
| myview                  | VIEW  |                      |                                |
+-------------------------+-------+----------------------+--------------------------------+

示例:

输入以下命令可列出默认项目的数据集 mydataset 中的表。

bq ls --format=pretty mydataset

输入以下命令可列出 myotherproject 的数据集 mydataset 中的表。

bq ls --format=pretty myotherproject:mydataset

API

如需使用 API 列出表,请调用 tables.list 方法。

在提取时间分区表中列出分区

您可以通过查询 _PARTITIONTIME 伪列(使用标准 SQL)或 __PARTITIONS_SUMMARY__ 元表(使用旧版 SQL)在提取时间分区表中列出分区。

如需运行查询,您可以使用 GCP Console、经典版 BigQuery 网页界面或 bq query 命令,也可以调用 jobs.insert 方法并配置 query 作业。

所需权限

如需运行使用 __PARTITIONS_SUMMARY__ 元表或 _PARTITIONTIME 伪列的查询作业,您必须拥有 bigquery.jobs.create 权限。以下预定义的 Cloud IAM 角色包含 bigquery.jobs.create 权限:

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

您还必须拥有 bigquery.tables.getData 权限。以下预定义的 Cloud IAM 角色包含 bigquery.tables.getData 权限:

  • bigquery.admin
  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.dataViewer

如需详细了解 BigQuery 中的 Cloud IAM 角色和权限,请参阅预定义的角色和权限

在提取时间分区表中列出分区

您可以使用标准 SQL(首选)或旧版 SQL 在提取时间分区表中列出分区。如需列出分区,请执行以下操作:

标准 SQL:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 BigQuery 网页界面

  2. 点击编写新查询按钮。

  3. 查询编辑器框中输入以下文本,以查询 _PARTITIONTIME 伪列:

    SELECT
      _PARTITIONTIME as pt
    FROM
      `dataset.table`
    GROUP BY 1
    

    其中:

    • dataset 是包含表的数据集
    • table 是表的名称
  4. (可选)点击展开并选择查询设置

    查询设置

  5. 点击运行

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query 按钮。

  3. New Query 框中输入以下文本,以查询某个表的 _PARTITIONTIME 伪列:

    #standardSQL
    SELECT
      _PARTITIONTIME as pt
    FROM
      `dataset.table`
    GROUP BY 1
    

    其中:

    • dataset 是包含表的数据集
    • table 是表的名称
  4. 点击 Show Options

  5. (可选)在 Processing Location 部分,点击 Unspecified 并选择数据的位置

  6. 点击 Run Query

CLI

使用 bq query 命令输入以下查询:

bq --location=location query --use_legacy_sql=false '
SELECT
  _PARTITIONTIME as pt
FROM
  `dataset.table`
GROUP BY 1'

其中:

  • location 是您位置的名称--location 是可选标志。例如,如果您在东京区域使用 BigQuery,可以将该标志的值设为 asia-northeast1。 您可以使用 .bigqueryrc 文件设置位置的默认值。
  • dataset 是包含表的数据集
  • table 是表的名称

API

调用 jobs.insert 方法,并配置一个用于查询表的 _PARTITIONTIME 伪列的 query 作业。

作业资源 jobReference 部分的 location 属性中,指定您的位置。

旧版 SQL:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 BigQuery 网页界面

  2. 点击编写新查询按钮。

  3. 查询编辑器框中输入以下文本,以查询 __PARTITIONS_SUMMARY__ 元表:

    #legacySQL
    SELECT
      partition_id
    FROM
      [dataset.table$__PARTITIONS_SUMMARY__]
    

    其中:

    • dataset 是包含表的数据集
    • table 是表的名称
  4. 点击更多,然后选择查询设置

    查询设置

  5. 处理位置部分,点击自动选择并选择数据的位置。如果数据位于 USEU 多区域位置,则您可以将处理位置设置为“自动选择”。当您的数据位于 USEU 中时,系统会自动检测处理位置。

    查询处理位置

  6. 点击运行

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query 按钮。

  3. New Query 框中输入以下文本,以查询某个表的 __PARTITIONS_SUMMARY__ 元表:

    #legacySQL
    SELECT
       partition_id
     FROM
       [dataset.table$__PARTITIONS_SUMMARY__]
    

    其中:

    • dataset 是包含表的数据集
    • table 是表的名称
  4. 点击 Show Options

  5. (可选)在 Processing Location 部分,点击 Unspecified 并选择数据的位置

  6. 点击 Run Query

CLI

使用 bq query 命令输入以下查询:

bq --location=location query --use_legacy_sql=true '
SELECT
   partition_id
 FROM
   [dataset.table$__PARTITIONS_SUMMARY__]'

其中:

  • location 是您位置的名称--location 是可选标志。例如,如果您在东京区域使用 BigQuery,可以将该标志的值设为 asia-northeast1。 您可以使用 .bigqueryrc 文件设置位置的默认值。
  • dataset 是包含表的数据集
  • table 是表的名称

API

调用 jobs.insert 方法,并配置一个用于查询 __PARTITIONS_SUMMARY__ 元表的 query 作业。

作业资源 jobReference 部分的 location 属性中,指定您的位置。

使用元表获取表元数据

您可以通过使用称为元表的特殊表来获取有关分区表的信息:元表包含元数据,例如数据集中的表和视图列表。元表是只读的。

使用元表获取分区元数据

__PARTITIONS_SUMMARY__ 元表是一个特殊的表,其内容表示时间分区表中关于分区的元数据。__PARTITIONS_SUMMARY__ 元表为只读。

如需访问时间分区表中有关分区的元数据,请在查询的 SELECT 语句中使用 __PARTITIONS_SUMMARY__ 元表。您可以通过以下方式运行查询:

  • 使用 GCP Console 或经典版 BigQuery 网页界面
  • 使用命令行工具的 bq query 命令
  • 调用 jobs.insert API 方法并配置 query 作业
  • 使用客户端库

目前,标准 SQL 不支持分区装饰器分隔符 ($),因此,您不能使用标准 SQL 来查询 __PARTITIONS_SUMMARY__。使用 __PARTITIONS_SUMMARY__ 元表的旧版 SQL 查询如下所示:

SELECT
  column
FROM
  [dataset.table$__PARTITIONS_SUMMARY__]

其中:

  • dataset 是数据集的名称。
  • table 是时间分区表的名称。
  • column 是以下列之一:
说明
project_id 项目名称。
dataset_id 数据集名称。
table_id 时间分区表的名称。
partition_id 分区的名称(日期)。
creation_time 创建分区的时间,以从 UTC 1970 年 1 月 1 日起计算的毫秒数表示。
last_modified_time 上次修改分区的时间,以从 UTC 1970 年 1 月 1 日起计算的毫秒数表示。

分区元表权限

为运行使用 __PARTITIONS_SUMMARY__ 元表的查询作业,您至少必须拥有 bigquery.jobs.create 权限。以下预定义的 Cloud IAM 角色包含 bigquery.jobs.create 权限:

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

您还必须拥有 bigquery.tables.getData 权限。以下预定义的 Cloud IAM 角色包含 bigquery.tables.getData 权限:

  • bigquery.dataViewer
  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

如需详细了解 BigQuery 中的 Cloud IAM 角色,请参阅访问控制

分区元表示例

以下查询将检索名为 mydataset.mytable 的时间分区表的所有分区元数据。

控制台

#legacySQL
SELECT
  *
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]

经典版界面

#legacySQL
SELECT
  *
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]

CLI

bq query --use_legacy_sql=true '
SELECT
  *
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]'

输出如下所示:

+----------------+------------+----------------+--------------+---------------+--------------------+
|   project_id   | dataset_id |    table_id    | partition_id | creation_time | last_modified_time |
+----------------+------------+----------------+--------------+---------------+--------------------+
| myproject      | mydataset  | mytable        | 20160314     | 1517190224120 | 1517190224997      |
| myproject      | mydataset  | mytable        | 20160315     | 1517190224120 | 1517190224997      |
+----------------+------------+----------------+--------------+---------------+--------------------+

以下查询列出了上次修改 mydataset.mytable 中分区的时间。

控制台

#legacySQL
SELECT
  partition_id,
  last_modified_time
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]

经典版界面

#legacySQL
SELECT
  partition_id,
  last_modified_time
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]

CLI

bq query --use_legacy_sql=true '
SELECT
  partition_id,
  last_modified_time
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]'

输出如下所示:

+--------------+--------------------+
| partition_id | last_modified_time |
+--------------+--------------------+
| 20160102     |      1471632556179 |
| 20160101     |      1471632538142 |
| 20160103     |      1471632570463 |
+--------------+--------------------+

如需以便于阅读的格式显示 last_modified_time 字段,请使用 FORMAT_UTC_USEC 函数。例如:

控制台

#legacySQL
SELECT
  partition_id,
  FORMAT_UTC_USEC(last_modified_time*1000) AS last_modified
FROM
  [mydataset.table1$__PARTITIONS_SUMMARY__]

经典版界面

#legacySQL
SELECT
  partition_id,
  FORMAT_UTC_USEC(last_modified_time*1000) AS last_modified
FROM
  [mydataset.table1$__PARTITIONS_SUMMARY__]

CLI

bq query --use_legacy_sql=true '
SELECT
  partition_id,
  FORMAT_UTC_USEC(last_modified_time*1000) AS last_modified
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]'

输出如下所示:

+--------------+----------------------------+
| partition_id |       last_modified        |
+--------------+----------------------------+
| 20160103     | 2016-08-19 18:49:30.463000 |
| 20160102     | 2016-08-19 18:49:16.179000 |
| 20160101     | 2016-08-19 18:48:58.142000 |
+--------------+----------------------------+

示例:使用查询结果创建提取时间分区表

在此示例中,您将使用命令行工具创建提取时间分区表,并使用查询结果将数据添加到三个分区。该表将包含 2016 年最初三天的天气数据,这些数据按日期分区。

此示例查询 NOAA GSOD 天气数据集,以获取 2016 年前三天的温度,并将结果写入分区表。

步骤 1. 在名为 mydataset 的数据集中创建一个名为 temps 的空提取时间分区表。无需为表指定架构。查询结果中的架构用作表的架构定义。

bq mk --time_partitioning_type=DAY mydataset.temps

如需查看配置设置,请使用 bq show 命令:

bq show --format=prettyjson mydataset.temps

bq show 命令输出中查找 timePartitioning 条目:

{
  ...
  "timePartitioning": {
    "type": "DAY"
  },
  "type": "TABLE"
}

步骤 2. 查询 NOAA GSOD 天气数据集,以获取 2016 年最初三天的温度,并将结果写入 temps 表中的相应分区。以下查询使用 --destination_table 选项和标准 SQL 语法将 100 行查询结果写入分区。

  1. 运行以下查询,将 2016 年 1 月 1 日的温度写入分区 mydataset.temps$20160101

    bq query --use_legacy_sql=false \
    --destination_table 'mydataset.temps$20160101' \
    'SELECT
       stn,
       temp
     FROM
       `bigquery-public-data`.noaa_gsod.gsod2016
     WHERE
       mo="01"
       AND da="01"
     LIMIT
       100'
    
  2. 运行以下查询,将 2016 年 1 月 2 日的温度写入分区 mydataset.temps$20160102

    bq --location=US query --use_legacy_sql=false \
    --destination_table 'mydataset.temps$20160102' \
    'SELECT
       stn,
       temp
     FROM
       `bigquery-public-data`.noaa_gsod.gsod2016
     WHERE
       mo="01"
       AND da="02"
     LIMIT
       100'
    
  3. 运行以下查询,将 2016 年 1 月 3 日的温度写入分区 mydataset.temps$20160103

    bq --location=US query --use_legacy_sql=false \
    --destination_table 'mydataset.temps$20160103' \
    'SELECT
       stn,
       temp
     FROM
       `bigquery-public-data`.noaa_gsod.gsod2016
     WHERE
       mo="01"
       AND da="03"
     LIMIT
       100'
    

第 3 步: 通过使用 bq show 命令确认表中具有 300 行。

bq show mydataset.temps

结果显示架构和总行数。

  Last modified        Schema       Total Rows   Total Bytes     Expiration      Time Partitioning   Labels   kmsKeyName
 ----------------- ---------------- ------------ ------------- ----------------- ------------------- -------- ------------
  28 Jan 15:03:45   |- stn: string   300          4800          29 Jan 15:00:32   DAY
                    |- temp: float

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面