更新视图属性

本文档介绍了如何在 BigQuery 中更新视图属性。创建视图后,您可以更新以下视图属性:

所需权限

更新视图所需的权限与更新表所需的权限相同,也就是说,您必须具有数据集级层的 WRITER 访问权限,或者必须被指定为具有所需 bigquery.tables.update 权限的项目级层 IAM 角色。以下预定义的项目级层 IAM 角色具有 bigquery.tables.update 权限:

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

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

更新视图的 SQL 查询

您可以通过以下方式更新用于定义视图的 SQL 查询:

  • 使用 GCP Console 或经典版 BigQuery 网页界面
  • 使用命令行工具的 bq update 命令
  • 调用 tables.patch API 方法。

您可以在 CLI 或 API 中将 SQL 方言从旧版 SQL 更改为标准 SQL。您无法在 GCP Console 或经典版 BigQuery 网页界面中将旧版 SQL 视图更新为标准 SQL。

要更新视图的 SQL 查询,请执行以下操作:

经典版界面

  1. 选择视图。

  2. 视图详细信息 (View Details) 面板中,点击详细信息

  3. 查询框下方,点击修改查询

  4. 查询框中修改查询,然后点击保存视图

    更新视图

命令行

发出带 --view 标记的 bq update 命令。要使用标准 SQL 或者将查询方言从旧版 SQL 更新为标准 SQL,请包含 --use_legacy_sql 标记并将其设置为 false

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

如果您要更新的是默认项目以外的项目中的视图,请按照此格式将项目 ID 添加到该数据集名称:[PROJECT_ID]:[DATASET]

bq update --use_legacy_sql=false --view_udf_resource=[PATH_TO_FILE] --view='[QUERY]' [PROJECT_ID]:[DATASET].[VIEW]

其中:

  • [PATH_TO_FILE] 是一个代码文件的 URI 或本地文件系统路径,该代码文件会立即作为视图使用的用户定义函数资源进行加载和评估。重复使用该标志可指定多个文件。
  • [QUERY] 是一条有效的标准 SQL 查询。
  • [PROJECT_ID] 是您的项目 ID。
  • [DATASET] 是包含相应视图的数据集。
  • [VIEW] 是要更新的视图的名称。

示例:

输入以下命令以更新 mydataset 中名为 myview 的视图的 SQL 查询。mydataset 在您的默认项目中。用于更新视图的示例查询从美国名称数据公开数据集中查询数据。

bq update --use_legacy_sql=false --view 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC' mydataset.myview

输入以下命令以更新 mydataset 中名为 myview 的视图的 SQL 查询。mydatasetmyotherproject 中,不在您的默认项目中。用于更新视图的示例查询从美国名称数据公开数据集中查询数据。

bq update --use_legacy_sql=false --view 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC' myotherproject:mydataset.myview

API

要更新视图,您可以使用包含已更新 view 属性的表资源调用 tables.patch 方法。由于 tables.update 方法会替换整个表资源,因此最好使用 tables.patch 方法。

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")
view := client.Dataset(datasetID).Table(viewID)
meta, err := view.Metadata(ctx)
if err != nil {
	return err
}

newMeta := bigquery.TableMetadataToUpdate{
	// This example updates a view into the shakespeare dataset to exclude works named after kings.
	ViewQuery: "SELECT word, word_count, corpus, corpus_date FROM `bigquery-public-data.samples.shakespeare` WHERE corpus NOT LIKE '%king%'",
}

if _, err := view.Update(ctx, newMeta, meta.ETag); 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 update a shared view of a source table of
# US States. The view's query will be updated to contain only states with
# names starting with 'M'.
view_ref = shared_dataset_ref.table('my_shared_view')
view = bigquery.Table(view_ref)
sql_template = (
    'SELECT name, post_abbr FROM `{}.{}.{}` WHERE name LIKE "M%"')
view.view_query = sql_template.format(
    project, source_dataset_id, source_table_id)
view = client.update_table(view, ['view_query'])  # API request

更新视图的到期时间

您可以在数据集级层设置默认的视图到期时间,也可以在创建视图时设置视图的到期时间。如果在创建视图时设置到期时间,则会忽略数据集的默认视图到期时间。如果未在数据集级层设置默认的视图到期时间,也未在创建视图时设置到期时间,则该视图永不过期,您必须手动删除该视图。

在创建视图之后的任何时候,您都可以通过以下方式更新视图的到期时间:

  • 使用经典版 BigQuery 网页界面
    • GCP Console 当前不支持修改视图到期时间
  • 使用 CLI 的 bq update 命令
  • 调用 tables.patch API 方法。

更新视图的到期时间时,必须根据视图的创建时间计算到期时间。例如,如果视图创建于 2018 年 1 月 3 日,今天是 1 月 5 日,而您使用 BigQuery 网页界面将到期时间设置为 1 天,则该到期时间将被视为“过去”,系统会立刻删除该视图。

要更新视图的到期时间,请执行以下操作:

经典版界面

使用网页界面创建视图时,无法添加到期时间。创建视图后,您可以在视图详细信息 (View Details) 页面上添加或更新到期时间。

  1. 在导航窗格中,选择视图。

  2. 视图详细信息 (View Details) 页面上,点击详细信息

  3. 对于到期时间,点击修改

  4. 更新到期时间 (Update Expiration) 对话框中,点击剩余时间 (In),输入以天为单位的到期时间。

  5. 点击确定。已更新的到期时间会显示在详细信息页面上。

    视图到期时间

命令行

发出带 --expiration 标志的 bq update 命令。如果您要更新的是默认项目以外的项目中的视图,请按照此格式将项目 ID 添加到该数据集名称:[PROJECT_ID]:[DATASET]

bq update --expiration [INTEGER] [PROJECT_ID]:[DATASET].[VIEW]

其中:

  • [INTEGER] 是表的默认生命周期(以秒为单位)。最小值为 3600 秒(一小时)。到期时间以当前时间加上这个整数值为准。
  • [PROJECT_ID] 是您的项目 ID。
  • [DATASET] 是包含要更新的视图的数据集的名称。
  • [VIEW] 是要更新的视图的名称。

示例:

输入以下命令可将 mydatasetmyview 的到期时间更新为 5 天(432000 秒)。mydataset 在默认项目中。

bq update --expiration 432000 mydataset.myview

输入以下命令可将 mydatasetmyview 的到期时间更新为 5 天(432000 秒)。mydatasetmyotherproject 中,不在默认项目中。

bq update --expiration 432000 myotherproject:mydataset.myview

API

调用 tables.patch 方法,并使用 expirationTime 属性来更新视图的到期时间(以毫秒为单位)。由于 tables.update 方法会替换整个表资源,因此最好使用 tables.patch 方法。

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")
tableRef := client.Dataset(datasetID).Table(tableID)
meta, err := tableRef.Metadata(ctx)
if err != nil {
	return err
}
update := bigquery.TableMetadataToUpdate{
	ExpirationTime: time.Now().Add(time.Duration(5*24) * time.Hour), // table expiration in 5 days.
}
if _, err = tableRef.Update(ctx, update, meta.ETag); err != nil {
	return err
}

Python

更新视图到期时间的过程与更新表到期时间的过程相同。

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

import datetime
import pytz

# from google.cloud import bigquery
# client = bigquery.Client()
# table_ref = client.dataset('my_dataset').table('my_table')
# table = client.get_table(table_ref)  # API request

assert table.expires is None

# set table to expire 5 days from now
expiration = datetime.datetime.now(pytz.utc) + datetime.timedelta(days=5)
table.expires = expiration
table = client.update_table(table, ['expires'])  # API request

# expiration is stored in milliseconds
margin = datetime.timedelta(microseconds=1000)
assert expiration - margin <= table.expires <= expiration + margin

更新视图的说明

您可以通过以下方式更新视图的说明:

  • 使用 GCP Console 或经典版 BigQuery 网页界面
  • 使用 bq update CLI 命令
  • 调用 tables.patch API 方法

要更新视图的说明,请执行以下操作:

经典版界面

使用 BigQuery 网页界面创建视图时,无法添加说明。创建视图后,您可以在视图详细信息 (View Details) 页面上添加说明。

  1. 在导航窗格中,选择视图。

  2. 视图详细信息 (View Details) 页面上,点击详细信息

  3. 说明部分,点击说明此视图 (Describe this view) 以打开说明框。

  4. 在该框中输入说明。点击说明框以外的位置即可保存文本。

    表的说明

命令行

发出带 --description 标志的 bq update 命令。如果您要更新的是默认项目以外的项目中的视图,请按照此格式将项目 ID 添加到该数据集名称:[PROJECT_ID]:[DATASET]

bq update --description "[DESCRIPTION]" [PROJECT_ID]:[DATASET].[VIEW]

其中:

  • [DESCRIPTION] 是说明视图的文字,括在英文引号之间。
  • [PROJECT_ID] 是您的项目 ID。
  • [DATASET] 是包含要更新的视图的数据集的名称。
  • [VIEW] 是要更新的视图的名称。

示例:

输入以下命令可将 mydatasetmyview 的说明更改为“Description of myview”。mydataset 在默认项目中。

bq update --description "Description of myview" mydataset.myview

输入以下命令可将 mydatasetmyview 的说明更改为“Description of mytable”。mydatasetmyotherproject 中,不在默认项目中。

bq update --description "Description of myview" myotherproject:mydataset.myview

API

表资源中调用 tables.patch 方法并使用 description 属性来更新视图的说明。由于 tables.update 方法会替换整个表资源,因此最好使用 tables.patch 方法。

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")
tableRef := client.Dataset(datasetID).Table(tableID)
meta, err := tableRef.Metadata(ctx)
if err != nil {
	return err
}
update := bigquery.TableMetadataToUpdate{
	Description: "Updated description.",
}
if _, err = tableRef.Update(ctx, update, meta.ETag); err != nil {
	return err
}

Java

更新视图说明的过程与更新表说明的过程相同。

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

// String datasetName = "my_dataset_name";
// String tableName = "my_table_name";
// String newDescription = "new_description";

Table beforeTable = bigquery.getTable(datasetName, tableName);
TableInfo tableInfo = beforeTable.toBuilder()
    .setDescription(newDescription)
    .build();
Table afterTable = bigquery.update(tableInfo);

Python

更新视图说明的过程与更新表说明的过程相同。

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

# from google.cloud import bigquery
# client = bigquery.Client()
# table_ref = client.dataset('my_dataset').table('my_table')
# table = client.get_table(table_ref)  # API request

assert table.description == 'Original description.'
table.description = 'Updated description.'

table = client.update_table(table, ['description'])  # API request

assert table.description == 'Updated description.'

后续步骤

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

发送以下问题的反馈:

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