创建并使用整数范围分区表

本文档介绍如何创建和使用按整数列分区的表。如需了解其他类型的分区表,请参阅创建和使用日期/时间戳分区表创建和使用提取时间分区表

如需详细了解整数范围分区,请参阅整数范围分区表

创建整数范围分区表后,您可以执行以下操作:

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

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

限制

整数范围分区表存在如下限制:

  • 分区列必须为 INTEGER 列。虽然列模式可以是 REQUIREDNULLABLE,但不能是 REPEATED(基于数组)。
  • 此外,分区列必须是顶级字段。不能将 RECORD (STRUCT) 中的叶字段用作分区列。
  • 不能使用旧版 SQL 查询分区表,也不能将查询结果写入分区表中。

创建分区表

您可以通过以下任一方法在 BigQuery 中创建整数范围分区表:

  • 使用 Cloud Console 或经典版网页界面
  • 使用 DDL CREATE TABLE 语句并附加一个包含 partition expressionPARTITION BY RANGE_BUCKET 子句
  • 使用 bq 命令行工具的 bq mk 命令
  • 调用 tables.insert API 方法以编程方式创建
  • 使用查询结果
  • 加载数据

表命名

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

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

所需权限

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

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

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

以下预定义的 IAM 角色同时具有 bigquery.tables.createbigquery.tables.updateData 权限:

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

以下预定义的 IAM 角色具有 bigquery.jobs.create 权限:

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

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

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

创建含架构定义的空分区表

您无法创建不含架构定义的空分区表。必须使用架构,才能确定用于创建分区的列。

创建含架构定义的空分区表时,您可以执行下列操作:

  • 使用 bq 命令行工具以内嵌方式提供架构
  • 使用 bq 命令行工具指定 JSON 架构文件
  • 调用 API 的 tables.insert 方法时,在表资源中提供架构

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

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

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

如需创建带架构定义的空分区表,请执行下列操作:

控制台

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

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

  3. 在窗口右侧的详细信息面板中,点击创建表

  4. 创建表面板的来源部分,执行以下操作:

    • 基于以下数据创建表部分,选择空表
  5. 目标部分中执行如下设置:

    • 对于数据集名称,选择相应的数据集,然后在表名称字段中输入要创建的表的名称。
    • 确认表类型设置为原生表
  6. 架构部分中,输入架构定义。

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

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

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

  7. 分区和集群设置下,从分区下拉列表中选择一个类型为 INTEGER 的列。

  8. start(起始值)、end(终止值)和 interval(间隔值)提供值。

    • start 是范围分区的起始值(含边界值)
    • end 是范围分区的终止值(不含边界值)
    • interval 是分区中每个范围的宽度
  9. (可选)在分区过滤条件中,点击需要分区过滤条件框,以要求用户添加 WHERE 子句来指定要查询的分区。要求分区过滤条件有可能减少费用并提高性能。如需了解详情,请参阅查询分区表

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

  11. 点击创建表

DDL

借助数据定义语言 (DDL) 语句,您可以使用标准 SQL 查询语法创建和修改表和视图。

详细了解如何使用数据定义语言语句

要在 Cloud Console 中使用 DDL 语句创建分区表,请执行以下操作:

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

  2. 点击编写新查询

  3. 查询编辑器文本区域中,输入您的 CREATE TABLE DDL 语句

    以下查询会创建一个名为 newtable 的表,该表在 customer_id 列具有一个整数范围分区,其中起始值为 0,终止值为 100,间隔值为 10。

     CREATE TABLE
       mydataset.newtable
     PARTITION BY
       RANGE_BUCKET(customer_id, GENERATE_ARRAY(0, 100, 10))
     AS SELECT 1 AS customer_id, DATE "2019-10-01" AS date1
     

  4. 点击运行。查询完成后,该表将显示在资源窗格中。

bq

使用带有 --range_partitioning 标志的 mk 命令:

bq mk \
--range_partitioning=column_name,start,end,interval \
project_id:dataset.table \
"column_name:integer,value:integer"

其中:

  • column_name 是用于创建整数范围分区的列。
  • start 是范围分区的起始值(含边界值)
  • end 是范围分区的终止值(不含边界值)
  • interval 是分区中每个范围的宽度
  • project_id 是项目 ID。
  • dataset 是您的项目中的数据集。
  • table 是您正在创建的分区表的名称。

示例:

输入以下命令,在默认项目的 mydataset 中创建名为 mypartitionedtable 的整数范围分区表。分区基于起始值 0、终止值 100 和间隔值 10。

--require_partition_filter 标志用于要求用户添加 WHERE 子句来指定要查询的分区。要求分区过滤条件有可能减少费用并提高性能。如需了解详情,请参阅查询分区表

bq mk \
--require_partition_filter \
--range_partitioning=customer_id,0,100,10 \
mydataset.mypartitionedtable \
"customer_id:integer,value:integer"

创建表后,您可以使用 bq 命令行工具更新分区表的 表过期时间分区过期时间说明标签

API

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

Java

试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.RangePartitioning;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.StandardTableDefinition;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableInfo;

// Sample to create a range partitioned table
public class CreateRangePartitionedTable {

  public static void runCreateRangePartitionedTable() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    Schema schema =
        Schema.of(
            Field.of("integerField", StandardSQLTypeName.INT64),
            Field.of("stringField", StandardSQLTypeName.STRING),
            Field.of("booleanField", StandardSQLTypeName.BOOL),
            Field.of("dateField", StandardSQLTypeName.DATE));
    createRangePartitionedTable(datasetName, tableName, schema);
  }

  public static void createRangePartitionedTable(
      String datasetName, String tableName, Schema schema) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);

      // Note: The field must be a top- level, NULLABLE/REQUIRED field.
      // The only supported type is INTEGER/INT64
      RangePartitioning partitioning =
          RangePartitioning.newBuilder()
              .setField("integerField")
              .setRange(
                  RangePartitioning.Range.newBuilder()
                      .setStart(1L)
                      .setInterval(2L)
                      .setEnd(10L)
                      .build())
              .build();

      StandardTableDefinition tableDefinition =
          StandardTableDefinition.newBuilder()
              .setSchema(schema)
              .setRangePartitioning(partitioning)
              .build();
      TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();

      bigquery.create(tableInfo);
      System.out.println("Range partitioned table created successfully");
    } catch (BigQueryException e) {
      System.out.println("Range partitioned table was not created. \n" + e.toString());
    }
  }
}

Node.js

在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请查看 BigQuery Node.js API 参考文档

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function createTableRangePartitioned() {
  // Creates a new integer range partitioned table named "my_table"
  // in "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // const tableId = "my_table";

  const schema = [
    {name: 'fullName', type: 'STRING'},
    {name: 'city', type: 'STRING'},
    {name: 'zipcode', type: 'INTEGER'},
  ];

  // To use integer range partitioning, select a top-level REQUIRED or
  // NULLABLE column with INTEGER / INT64 data type. Values that are
  // outside of the range of the table will go into the UNPARTITIONED
  // partition. Null values will be in the NULL partition.
  const rangePartition = {
    field: 'zipcode',
    range: {
      start: 0,
      end: 100000,
      interval: 10,
    },
  };

  // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
  const options = {
    schema: schema,
    rangePartitioning: rangePartition,
  };

  // Create a new table in the dataset
  const [table] = await bigquery
    .dataset(datasetId)
    .createTable(tableId, options);

  console.log(`Table ${table.id} created with integer range partitioning: `);
  console.log(table.metadata.rangePartitioning);
}

Python

在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to create.
# table_id = "your-project.your_dataset.your_table_name"

schema = [
    bigquery.SchemaField("full_name", "STRING"),
    bigquery.SchemaField("city", "STRING"),
    bigquery.SchemaField("zipcode", "INTEGER"),
]

table = bigquery.Table(table_id, schema=schema)
table.range_partitioning = bigquery.RangePartitioning(
    # To use integer range partitioning, select a top-level REQUIRED /
    # NULLABLE column with INTEGER / INT64 data type.
    field="zipcode",
    range_=bigquery.PartitionRange(start=0, end=100000, interval=10),
)
table = client.create_table(table)  # Make an API request.
print(
    "Created table {}.{}.{}".format(table.project, table.dataset_id, table.table_id)
)

要验证是否已按整数列对表进行分区,请检查架构。例如,运行以下命令:

bq show --format=prettyjson mydataset.mytable

如果整数列已进行了分区,则 bq show 的输出将包含 rangePartitioning 数据:

...
  "rangePartitioning": {
    "field": "customer_id",
    "range": {
      "end": "100",
      "interval": "10",
      "start": "0"
    }
  },
...

写入整数范围分区表

写入整数范围分区表的数据会自动进行分区。写入表的方式包括加载作业、查询和流式传输。

对于流式传输,流式缓冲区中的数据位于 UNPARTITIONED 分区。提取数据时,数据最初会保留在 UNPARTITIONED 分区中。当未分区数据累积到足够多时,系统会将其重新分区到特定分区。

以下示例演示了如何将查询结果保存到整数范围分区表:

bq query --nouse_legacy_sql \
--destination_table=mydataset.mytable \
'SELECT value AS customer_id, value+1 AS value FROM UNNEST(GENERATE_ARRAY(-5, 110, 5)) AS value'

查询整数范围分区表

整数范围分区表只能通过标准 SQL 进行查询。在查询整数范围分区表时,如果整数分区列有过滤条件,则这些过滤条件将用于删减分区和降低查询费用。

以下查询将扫描起始值为 30、40 和 50 的 3 个分区。

bq query --nouse_legacy_sql \
'SELECT * FROM mydataset.mytable WHERE customer_id BETWEEN 30 AND 50'

下面是 bq query 命令的示例输出结果:

Waiting on bqjob_r4fce65fa3381528e_000001670994aeb6_1 ... (0s) Current status: DONE
+---------+-------+
| customer_id | value |
+---------+-------+
|      40 |    41 |
|      45 |    46 |
|      30 |    31 |
|      35 |    36 |
|      50 |    51 |
+---------+-------+

在本示例中,每个分区有 2 行,每行有 2 个整数列,因此查询应扫描 3 * 2 * 2 * 8 = 96 个字节。您可以检查作业信息:

bq show -j bqjob_r4fce65fa3381528e_000001670994aeb6_1

下面是 bq show 命令的示例输出结果:

Job myproject:bqjob_r4fce65fa3381528e_000001670994aeb6_1

  Job Type    State      Start Time      Duration       User Email        Bytes Processed   Bytes Billed   Billing Tier   Labels
 ---------- --------- ----------------- ---------- --------------------- ----------------- -------------- -------------- --------
  query      SUCCESS   24 Sep 12:19:58   0:00:01    joe@google.com       96                10485760       1

支持 DML 语句。例如:

bq query --nouse_legacy_sql \
'DELETE FROM mydataset.mytable WHERE customer_id = 30'

目前,整数范围分区列上的函数不支持分区删减。例如,以下查询将扫描整个表。

bq query --nouse_legacy_sql \
'SELECT * FROM mydataset.mytable WHERE customer_id+1 BETWEEN 30 AND 50'

整数范围分区表上的表修饰器

与日期/时间戳分区类似,表修饰器可用于处理整数范围分区表中的分区。处理范围分区的关键是范围的起始值。

以下示例查询起始值为 0 的范围分区。该分区有 2 个值,分别为 0 和 5。

bq query 'SELECT * FROM mydataset.mytable$0'

+---------+-------+
| customer_id | value |
+---------+-------+
|       0 |     1 |
|       5 |     6 |
+---------+-------+

整数范围分区搭配聚簇

您可以将整数范围分区与聚簇操作搭配使用。数据首先按整数范围分区列进行分区,然后每个分区中的数据按聚簇列进行聚簇。

例如,以下命令会创建一个包含整数范围列和聚簇的表。

bq mk \
--range_partitioning=customer_id,0,100,10 \
--clustering_fields=value \
mydataset.mytable_2 \
"customer_id:integer,value:integer"

当您检索表的格式时,会发现范围分区和聚簇均已生效:

...
  "clustering": {
    "fields": [
      "value"
    ]
  },
...
  "rangePartitioning": {
    "field": "customer_id",
    "range": {
      "end": "100",
      "interval": "10",
      "start": "0"
    }
  },
...

基于查询结果创建分区表

如需基于查询结果创建分区表,请执行以下操作:

控制台

使用 Cloud Console 查询数据时,您无法为目标表指定分区选项。

bq

输入 bq query 命令,指定 --destination_table 标志可基于查询结果创建一个永久表,指定 --range_partitioning 标志可创建分区目标表。

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

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

输入以下命令可基于查询结果创建一个新的分区目标表:

bq --location=location query \
--destination_table project_id:dataset.table \
--range_partitioning column,start,end,interval \
--use_legacy_sql=false \
'query'

其中:

  • location 是位置的名称。--location 是可选标志。例如,如果您在东京使用 BigQuery,请将该标志的值设置为 asia-northeast1。您可以使用 .bigqueryrc 文件设置默认位置值。
  • project_id 是您的项目 ID。
  • dataset 是将包含新分区表的数据集的名称。
  • table 是您基于查询结果创建的分区表的名称。
  • column 是用于分区的 INTEGER 列。
  • start 是范围分区的起始值(含边界值)
  • end 是范围分区的终止值(不含边界值)
  • interval 是分区中每个范围的宽度
  • query 是使用标准 SQL 语法的查询。目前,无法使用旧版 SQL 查询分区表,也无法将查询结果写入分区表中。

示例:

输入以下命令可将查询结果写入 mydataset 中名为 mypartitionedtable 的目标表。mydataset 属于默认项目。该查询从非分区表(NHTSA 交通事故伤亡公共数据集)中检索数据。该表的 provider_id INTEGER 列用于创建分区。

bq query \
--destination_table mydataset.mypartitionedtable \
--use_legacy_sql=false \
--range_partitioning provider_id,10000,700000,10000 \
'SELECT
   provider_id, total_discharges, average_covered_charges
 FROM
   `bigquery-public-data`.medicare.inpatient_charges_2011
 LIMIT
   300'

API

要将查询结果保存到永久分区表中,请调用 jobs.insert 方法,配置一个 query 作业,并为 destinationTablerangePartitioning 属性添加值。

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

在加载数据时创建分区表

在将数据加载到新表的过程中,可以通过指定分区选项来创建分区表。无需创建空的分区表即可加载数据。可以同时创建分区表和加载数据。

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

通过分区装饰器,您可以将数据加载到特定分区。例如,假设某个表按 customer_id 列进行整数范围分区,其中起始值为 0,终止值为 100,间隔值为 10。要为 0 至 9 范围内的客户 ID 加载所有数据,请使用以下 $0 分区装饰器:

table_name$0

使用分区装饰器将数据加载到特定分区时,加载到分区的数据必须与相应表的分区架构相符。写入分区的所有行的值都应在分区日期范围内。

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

控制对分区表的访问权限

如需配置对表和视图的访问权限,您可以在以下级层为实体授予 IAM 角色,这些级层按照允许的资源范围从大到小依次排列:

对受 IAM 保护的任何资源的访问权限具有附加性。例如,如果某个实体没有项目等较高级层的访问权限,您可以在数据集级层向该实体授予访问权限,然后该实体便将有权访问该数据集中的表和视图。同样,如果实体没有较高级层或数据集级层的访问权限,您可以在表或视图级层向该实体授予访问权限。

Google Cloud 资源层次结构中授予更高级别的 IAM 角色(例如项目,文件夹或组织等级),使实体可访问广泛的资源集例如,在项目级层为实体授予角色会为该实体提供整个项目中所有数据集的访问权限。

在数据集级层授予角色可指定允许实体对该特定数据集中的表和视图执行的操作,即使实体没有更高级层的访问权限也可执行这些操作。如需详细了解如何配置数据集级层的访问权限控制,请参阅控制对数据集的访问权限

在表或视图级层授予角色可指定允许实体对特定表和视图执行的操作,即使实体没有更高级层的访问权限也可执行这些操作。如需了解如何配置表级层的访问权限控制,请参阅控制对表和视图的访问权限

您还可以创建 IAM 自定义角色。 如果创建自定义角色,则您授予的权限取决于您希望实体能够执行的具体操作。

您无法对受 IAM 保护的任何资源设置“拒绝”权限。

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

使用分区表

获取有关分区表的信息

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

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

所需权限

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

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

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

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

获取分区表信息

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

控制台

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

  2. 在导航面板的资源部分中,展开项目和数据集,然后点击列表中的表名称。

  3. 点击查询编辑器下方的详细信息。此标签页会显示表说明和表信息。

    表详细信息

  4. 点击 Schema 标签页查看表的架构定义。请注意,分区表不包含 _PARTITIONTIME 伪列。

bq

发出 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 的所有信息。mydataset 属于 myotherproject,而非默认项目。

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

输出应如下所示:

{
  "creationTime": "1569429717657",
  "etag": "AcSEmWFQdbYEGT0auTE9NA==",
  "id": "myproject:mydataset.newtable",
  "kind": "bigquery#table",
  "lastModifiedTime": "1569429717657",
  "location": "US",
  "numBytes": "16",
  "numLongTermBytes": "0",
  "numRows": "1",
  "rangePartitioning": {
    "field": "customer_id",
    "range": {
      "end": "100",
      "interval": "10",
      "start": "0"
    }
  },
  "schema": {
    "fields": [
      {
        "name": "customer_id",
        "type": "INTEGER"
      },
      {
        "name": "date1",
        "type": "DATE"
      }
    ]
  },
  "selfLink": "https://bigquery.googleapis.com/bigquery/v2/projects/myproject/datasets/mydataset/tables/newtable",
  "tableReference": {
    "datasetId": "mydataset,
    "projectId": "myproject",
    "tableId": "newtable"
  },
  "type": "TABLE"
}

API

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

列出某个数据集内的分区表

您可以通过以下方式列出数据集中的表(包括分区表):

  • 使用 Cloud Console 或经典版 BigQuery 网页界面
  • bq 命令行工具中使用 bq ls 命令
  • 调用 tables.list API 方法
  • 使用客户端库

所需权限

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

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

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

列出分区表

如需列出数据集中的表(包括分区表),请执行以下操作:

控制台

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

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

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

API

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

列出分区表中的分区

如需列出分区表中的分区,您可以使用旧版 SQL 查询 __PARTITIONS_SUMMARY__ 元表。

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

所需权限

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

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

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

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

要详细了解 BigQuery 中的 IAM 角色,请参阅访问权限控制

列出某个分区表中的分区

您可以使用旧版 SQL 来列出某个分区表中的分区。如需列出分区表中的分区,请按如下所述操作:

控制台

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

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

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

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

    其中:

    • dataset 是包含表的数据集。
    • table 是表的名称。
  4. 点击运行

bq

使用 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 作业。

使用元表获取分区表元数据

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

目前,您无法使用 INFORMATION_SCHEMA 服务来获取分区表元数据。

使用元表获取分区元数据

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

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

  • 使用 Cloud 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 权限。以下预定义的 IAM 角色具有 bigquery.jobs.create 权限:

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

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

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

要详细了解 BigQuery 中的 IAM 角色,请参阅访问权限控制

分区元表示例

以下查询会检索名为 mydataset.mytable 的范围分区表的所有分区元数据。

控制台

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

bq

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        | 10000        | 1517190224120 | 1517190224997      |
| myproject      | mydataset  | mytable        | 20000        | 1517190224120 | 1517190224997      |
+----------------+------------+----------------+--------------+---------------+--------------------+

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

控制台

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

bq

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

输出如下所示:

+--------------+--------------------+
| partition_id | last_modified_time |
+--------------+--------------------+
| 100000       |      1471632556179 |
| 20000        |      1471632538142 |
| 30000        |      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__]

bq

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        |
+--------------+----------------------------+
| 10000        | 2016-08-19 18:49:30.463000 |
| 20000        | 2016-08-19 18:49:16.179000 |
| 30000        | 2016-08-19 18:48:58.142000 |
+--------------+----------------------------+

后续步骤