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

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

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

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

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

创建提取时间分区表

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

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

在 BigQuery 中创建提取时间分区表时,每个数据集中的表名称不得重复。表名称可以:

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

所需权限

要创建提取时间分区表,您必须具有数据集级别的 WRITER 访问权限,或者必须拥有具备 bigquery.tables.create 权限的项目级层 IAM 角色。以下预定义的项目级层 IAM 角色具有 bigquery.tables.create 权限:

此外,由于 bigquery.user 角色具有 bigquery.datasets.create 权限,因此被分配了 bigquery.user 角色的用户可在其创建的任何数据集中创建分区表。在分配有 bigquery.user 角色的用户创建数据集后,系统将为该用户授予对该数据集的 OWNER 访问权限。凭借对数据集的 OWNER 访问权限,用户可以完全掌控该数据集以及其中的所有表。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅访问权限控制。如需详细了解数据集级别的角色,请参阅数据集的原初角色

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

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

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

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

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

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

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

Console

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

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

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

    • 验证表类型是否设置为原生表

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

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

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

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

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

    • 分区部分,点击不进行分区并选择按提取时间分区按提取时间分区
  6. 点击创建表格

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

经典版界面

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

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

  3. 创建表格页面的目标表部分,执行以下操作:

    • 对于,选择相应的数据集,然后在表名称字段中输入要创建的表的名称。
    • 验证表类型是否设置为原生表
  4. Schema 部分中,手动输入架构定义

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

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

        以 JSON 数组格式添加架构

      • 使用添加字段输入架构:

        使用添加字段添加架构

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

  6. 点击创建表格

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

命令行

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。要详细了解如何使用此标记,请参阅客户管理的加密密钥

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

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] 是采用 [FIELD]:[DATA_TYPE],[FIELD]:[DATA_TYPE] 格式的内联架构定义,或者是指向本地机器上的 JSON 架构文件的路径。

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

示例:

输入以下命令,在默认项目的 mydataset 中创建一个名为 mytable 的提取时间分区表。分区过期时间设为 259,200 秒(3 天),表的过期时间设为 2,592,000(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 的时间分区表。分区过期时间设为 259,200 秒(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

使用 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 --location=US 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 --location=US 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 属性添加值。

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

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

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

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

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

[TABLE_NAME]$20160501

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

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

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

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

提供 --location 标志并将值设置为您的位置

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

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] 是项目中的数据集。
  • [SOURCE_TABLE]_ 是日期分片表的前缀。
  • [DESTINATION_TABLE] 是您创建的分区表的名称。

示例:

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

bq --location=US 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 中,不在默认项目中。分区过期时间设为 86,400 秒(1 天)。日期分片源表的前缀为 sourcetable_。源表在默认项目中。mydataset 创建于 US 多区域位置。

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

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

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

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

不能直接分配对表或分区的访问权限控制。但可以通过在数据集级层或项目级层配置访问权限控制,控制表的访问权限。

数据集级层的访问权限控制指定用户、组和服务帐号可以对该特定数据集中的表执行的操作。如果仅分配数据集级层的权限,则还必须分配一个提供项目访问权限的初始或预定义项目级层角色,例如 bigquery.user

您可以分配预定义的项目级层 IAM 角色(这些角色可授予对项目中所有数据集内的所有表数据的权限),而不是授予对各个数据集的访问权限。

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

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

使用提取时间分区表

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

要获取有关表的信息,您可以使用 GCP Console、经典版 BigQuery 网页界面或 bq show CLI 命令,也可以调用 tables.get API 方法。

所需权限

如需获取有关表的信息,您必须拥有数据集的 READER 角色,或必须拥有具备 bigquery.tables.get 权限的项目级层 IAM 角色。如果您拥有项目级层的 bigquery.tables.get 权限,则可获取项目中所有表的相关信息。除了 bigquery.jobUserbigquery.user 外,其他所有预定义的项目级层 IAM 角色都具有 bigquery.tables.get 权限。

此外,分配有 bigquery.user 角色的用户具有 bigquery.datasets.create 权限。这样一来,分配有 bigquery.user 角色的用户就可以获取该用户创建的任何数据集内的表的相关信息。在分配有 bigquery.user 角色的用户创建数据集后,该用户将获得对该数据集的 OWNER 访问权限。凭借对数据集的 OWNER 访问权限,用户可以完全掌控该数据集以及其中的所有表。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅访问权限控制。要详细了解数据集级层角色,请参阅数据集的初始角色

获取提取时间分区表信息

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

Console

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

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

  3. 点击表名称。

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

    表详细信息

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

经典版界面

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

  2. 点击表名称。

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

    分区表详细信息

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

    分区表架构

命令行

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

如果您要获取默认项目以外的某个项目中的表的相关信息,请按以下格式将相应项目 ID 添加到数据集:[PROJECT_ID]:[DATASET]

bq show --schema --format=prettyjson [PROJECT_ID]:[DATASET].[TABLE]

其中:

  • [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 方法。

所需权限

要列出某个数据集中的表,您必须拥有数据集的 READER 角色,或者必须拥有具备 bigquery.tables.list 权限的项目级层 IAM 角色。如果您拥有项目级层的 bigquery.tables.list 权限,则可列出项目所含任何数据集中的表。除了 bigquery.jobUser 外,其他所有预定义的项目级层 IAM 角色都具有 bigquery.tables.list 权限。

要详细了解 BigQuery 中的 IAM 角色和权限,请参阅访问权限控制。要详细了解数据集级层角色,请参阅数据集的初始角色

列出分区表

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

Console

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

  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 权限。以下预定义的项目级层 IAM 角色具备 bigquery.jobs.create 权限:

您还必须拥有数据集级别的 READER 角色,或者必须拥有具备 bigquery.tables.getData 权限的项目级层 IAM 角色。除了 bigquery.userbigquery.jobUserbigquery.metadataViewer 之外,其他所有预定义的项目级层 IAM 角色都具备 bigquery.tables.getData 权限。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅访问权限控制。要详细了解数据集级层角色,请参阅数据集的初始角色

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

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

标准 SQL:

Console

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

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

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

    #standardSQL
    SELECT
      _PARTITIONTIME as pt
    FROM
      `[DATASET].[TABLE]`
    GROUP BY 1
    

    其中:

    • [DATASET] 是包含表的数据集。
    • [TABLE] 是表的名称。
  4. (可选)点击展开并选择查询设置

    查询设置

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

    查询处理位置

  6. 点击运行

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击撰写查询按钮。

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

    #standardSQL
    SELECT
      _PARTITIONTIME as pt
    FROM
      `[DATASET].[TABLE]`
    GROUP BY 1
    

    其中:

    • [DATASET] 是包含表的数据集。
    • [TABLE] 是表的名称。
  4. 点击显示选项

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

  6. 点击运行查询

CLI

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

bq --location=[LOCATION] query --use_legacy_sql=false '
SELECT
  _PARTITIONTIME as pt
FROM
  `[DATASET].[TABLE]`
GROUP BY 1'

Where:

  + `[LOCATION]` is the name of your location. The `--location` flag is
    optional. For example, if you are using BigQuery in
    the Tokyo region, you can set the flag's value to `asia-northeast1`.
    You can set a default value for the location using the
    [.bigqueryrc file](/bigquery/docs/bq-command-line-tool#setting_default_values_for_command-line_flags).
  + `[DATASET]` is the dataset that contains the table.
  + `[TABLE]` is the name of the table.

API

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

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

旧版 SQL:

Console

  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. 点击撰写查询按钮。

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

    #legacySQL
    SELECT
       partition_id
     FROM
       [[DATASET].[TABLE]$__PARTITIONS_SUMMARY__]
    

    其中:

    • [DATASET] 是包含表的数据集。
    • [TABLE] 是表的名称。
  4. 点击显示选项

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

  6. 点击运行查询

CLI

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

bq --location=[LOCATION] query --use_legacy_sql=true '
SELECT
   partition_id
 FROM
   [[DATASET].[TABLE]$__PARTITIONS_SUMMARY__]'

Where:

  + `[LOCATION]` is the name of your location. The `--location` flag is
    optional. For example, if you are using BigQuery in
    the Tokyo region, you can set the flag's value to `asia-northeast1`.
    You can set a default value for the location using the
    [.bigqueryrc file](/bigquery/docs/bq-command-line-tool#setting_default_values_for_command-line_flags).
  + `[DATASET]` is the dataset that contains the table.
  + `[TABLE]` is the name of the table.

API

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

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

使用元表获取表元数据

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

使用元表获取分区元数据

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

如需访问时间分区表中有关分区的元数据,请在查询的 SELECT 语句中使用 __PARTITIONS_SUMMARY__ 元表。如需运行查询,您可以使用 Console、经典版 BigQuery 网页界面或命令行工具的 bq query 命令,也可以调用 jobs.insert API 方法并配置查询作业

目前,标准 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 权限。以下预定义的项目级层 IAM 角色具备 bigquery.jobs.create 权限:

您还必须拥有数据集级别的 READER 角色,或者必须拥有具备 bigquery.tables.getData 权限的项目级层 IAM 角色。除了 bigquery.userbigquery.jobUserbigquery.metadataViewer 之外,其他所有预定义的项目级层 IAM 角色都具备 bigquery.tables.getData 权限。

分区元表示例

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

Console

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

经典版界面

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

命令行

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 中分区的时间。

Console

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

经典版界面

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

命令行

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 函数。例如:

Console

#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__]

命令行

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 年前三天的温度,并将结果写入分区表。此示例使用 --location=US 标志,因为您正在查询公共数据集。BigQuery 公共数据集存储于 US 多区域中。由于公共数据集存储于 US,因此不能将公共数据查询结果写入另一个区域的表中,也不能将公共数据集中的表与另一个区域中的表合并。

步骤 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 --location=US 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

后续步骤

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

发送以下问题的反馈:

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