创建视图

本文档介绍了如何在 BigQuery 中创建视图。

您可以通过以下方式在 BigQuery 中创建视图:

  • 使用 GCP Console 或传统版 BigQuery 网页界面
  • 使用命令行工具的 bq mk 命令
  • 调用 tables.insert API 方法
  • 提交 CREATE VIEW 数据定义语言 (DDL) 语句

视图命名

在 BigQuery 中创建视图时,每个数据集的视图名称必须唯一。视图名称可以:

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

视图限制

BigQuery 视图存在如下限制:

  • 包含视图的数据集与包含视图所引用的表的数据集必须位于相同位置
  • 您无法运行从视图导出数据的 BigQuery 作业。
  • 您无法使用 TableDataList JSON API 方法从视图中检索数据。如需了解详情,请参阅 Tabledata: list
  • 使用视图时,不能混合使用标准 SQL 查询和旧版 SQL 查询。标准 SQL 查询无法引用使用旧版 SQL 语法定义的视图。
  • 创建视图时,基础表的架构与视图一同存储。如果在视图创建之后对列执行添加、删除等操作,则在视图更新之前,系统报告的架构可能不准确。尽管系统报告的架构可能会不准确,但所有已提交的查询都会产生准确的结果。
  • 您无法自动将旧版 SQL 视图更新至标准 SQL 语法。要修改用于定义视图的查询,请使用 Console 或传统版 BigQuery 网页界面中的修改查询选项、bq update --view CLI 命令或 updatepatch API 方法。
  • 在定义了视图的 SQL 查询中,不能使用用户定义的函数。
  • 您不能在通配符表查询中引用视图。

如需了解适用于视图的配额和限制,请参阅视图限制

所需权限

在 BigQuery 中,视图作为表资源处理,因此创建视图所需的权限与创建表相同。要创建视图,您必须拥有数据集级的 WRITER 访问权限,或者分配有包含 bigquery.tables.create 权限的项目级 IAM 角色。以下预定义的项目级 IAM 角色包含 bigquery.tables.create 权限:

此外,由于 bigquery.user 角色具有 bigquery.datasets.create 权限,因此分配到 bigquery.user 角色的用户可以在该用户创建的任何数据集中创建视图。分配到 bigquery.user 角色的用户创建数据集后,将获得对该数据集的 OWNER 访问权限。 凭借对数据集的 OWNER 访问权限,用户可以完全掌控该数据集以及其中的所有表和视图。

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

创建视图

您可以通过编写用于定义视图可访问数据的 SQL 查询来创建视图。

在用于创建视图的标准 SQL 查询中,您必须在表和视图的引用中以 `[PROJECT_ID].[DATASET].[TABLE]` 格式添加项目 ID。标准 SQL 需要明确的项目 ID,以避免从不同项目查询视图时出现混淆。

要创建视图,请执行以下操作:

Console

  1. 运行查询后,点击查询结果窗口上方的保存视图按钮,将查询保存为视图。

    保存视图

  2. 保存视图对话框中,执行以下操作:

    • 对于项目名称,请选择将存储该视图的项目。
    • 对于数据集名称,请选择将包含该视图的数据集。包含视图的数据集与包含视图所引用的表的数据集必须位于相同位置
    • 对于表名称,请输入该视图的名称。
    • 点击保存

传统版界面

  1. 运行查询后,点击查询结果窗口中的保存视图按钮,将查询保存为视图。

    保存视图

  2. 保存视图对话框中,执行以下操作:

    • 对于项目,选择用于存储视图的项目。
    • 对于数据集,选择用于包含视图的数据集。包含视图的数据集与包含视图所引用的表的数据集必须位于相同位置
    • 对于表 ID,输入视图的名称。

      “保存视图”对话框

    • 点击确定

命令行

使用 mk 命令及 --view 标志。对于标准 SQL 查询,添加 --use_legacy_sql 标志并将其设置为 false。可选参数包括 --expiration--description--label

如果您的查询引用了存储在 Google Cloud Storage 或本地文件中的外部用户指定函数资源,请使用 --view_udf_resource 标志指定这些资源。此处未演示 --view_udf_resource 标志。如需详细了解用户指定函数 (UDF) 的使用方法,请参阅标准 SQL 用户指定函数

如果您要在默认项目以外的某个项目中创建视图,请使用 --project_id 标志指定项目 ID。

bq mk --use_legacy_sql=false --view_udf_resource=[PATH_TO_FILE] --expiration [INTEGER] --description "[DESCRIPTION]" --label [KEY:VALUE, KEY:VALUE] --view '[QUERY]' --project_id [PROJECT_ID] [DATASET].[VIEW]

其中:

  • [PATH_TO_FILE] 是一个代码文件的 URI 或本地文件系统路径,该代码文件会立即作为视图使用的用户定义函数资源进行加载和评估。重复使用该标志可指定多个文件。
  • [INTEGER] 是视图的默认生命周期(以秒为单位)。最小值为 3600 秒(一小时)。到期时间以当前时间加上这个整数值为准。如果您在创建视图时设置了到期时间,则系统会忽略数据集的默认表到期时间设置。
  • [DESCRIPTION] 是括在引号中的视图说明。
  • [KEY:VALUE] 是代表标签的键值对。可使用逗号分隔列表输入多个标签。
  • [QUERY] 是一个有效查询。对于标准 SQL 视图,查询必须在表和视图的引用中以 `[PROJECT_ID].[DATASET].[TABLE]` 格式添加项目 ID。
  • [PROJECT_ID] 是您的项目 ID(如果您未配置默认项目)。
  • [DATASET] 是项目中的数据集。
  • [VIEW] 是您要创建的视图的名称。

示例:

输入以下命令,在默认项目的 mydataset 中创建名为 myview 的视图。到期时间设置为 3600 秒(1 小时),说明设置为 This is my view,标签设置为 organization:development。查询用于通过美国名称数据公开数据集创建视图查询数据。

bq mk --use_legacy_sql=false --expiration 3600 --description "This is my view" --label organization:development --view 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC' mydataset.myview

输入以下命令,以便在 myotherproject 内的 mydataset 中创建名为 myview 的视图。到期时间设置为 3600 秒(1 小时),说明设置为 This is my view,标签设置为 organization:development。查询用于通过美国名称数据公开数据集创建视图查询数据。

bq mk --use_legacy_sql=false --expiration 3600 --description "This is my view" --label organization:development --view 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC' --project_id myotherproject mydataset.myview

创建视图后,您可以更新视图的到期时间说明标签

API

使用包含 view 属性的表资源调用 tables.insert 方法。

Go

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

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
meta := &bigquery.TableMetadata{
	// This example shows how to create a view of the shakespeare sample dataset, which
	// provides word frequency information.  This view restricts the results to only contain
	// results for works that contain the "king" in the title, e.g. King Lear, King Henry V, etc.
	ViewQuery: "SELECT word, word_count, corpus, corpus_date FROM `bigquery-public-data.samples.shakespeare` WHERE corpus LIKE '%king%'",
}
if err := client.Dataset(datasetID).Table(tableID).Create(ctx, meta); err != nil {
	return err
}

Python

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

# from google.cloud import bigquery
# client = bigquery.Client()
# project = 'my-project'
# source_dataset_id = 'my_source_dataset'
# source_table_id = 'us_states'
# shared_dataset_ref = client.dataset('my_shared_dataset')

# This example shows how to create a shared view of a source table of
# US States. The source table contains all 50 states, while the view will
# contain only states with names starting with 'W'.
view_ref = shared_dataset_ref.table("my_shared_view")
view = bigquery.Table(view_ref)
sql_template = 'SELECT name, post_abbr FROM `{}.{}.{}` WHERE name LIKE "W%"'
view.view_query = sql_template.format(project, source_dataset_id, source_table_id)
view = client.create_table(view)  # API request

print("Successfully created view at {}".format(view.full_table_id))

创建视图后,您可以按照与查询表相同的方式查询视图。

后续步骤

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

发送以下问题的反馈:

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