创建已获授权的视图

BigQuery 是一个 PB 级的分析数据仓库,可用于对大量数据近乎实时地运行 SQL 查询。

授予视图对数据集的访问权限也称为在 BigQuery 中创建已获授权的视图。借助已获授权的视图,您可以与特定用户和群组共享查询结果,而无需向其授予基础表的访问权限。您也可以使用视图的 SQL 查询来限制用户可查询的列(字段)。在本教程中,您将创建一个已获授权的视图。

目标

在本教程中,您将执行以下操作:

  • 创建数据集并对其应用访问权限控制
  • 向项目分配访问权限控制
  • 创建一个已获授权的视图,它用于限制用户可查询的数据

费用

BigQuery 是一款付费产品,本教程中涉及的操作将产生 BigQuery 使用费。BigQuery 提供每月 1 TB 的免费查询额度。如需了解详情,请参阅价格页面。

准备工作

在开始学习本教程之前,请先使用 Google Cloud Platform Console 创建或选择项目。

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 选择或创建 Google Cloud Platform 项目。

    转到“管理资源”页面

  3. 新项目中会自动启用 BigQuery。如需在现有项目中启用 BigQuery,请转到 启用BigQuery API。

    启用 API

  4. 如果您不想提供信用卡或为项目启用结算功能,BigQuery 会提供沙盒。无论您的项目是否启用了结算功能,本主题中的步骤都适用。如果您想启用结算功能,请参阅了解如何启用结算功能

简介

在本教程中,您将创建两个数据集:一个数据集用于源数据,第二个数据集用于已获授权的视图。使用来自 GitHub 公开数据集的数据填充源数据集。然后创建在源数据集中查询表的视图。

创建数据集和视图后,您可以向项目、包含视图的数据集和包含源数据的数据集分配访问权限控制。

授予视图对源数据集的访问权限也称为创建已获授权的视图。在创建已获授权的视图时,请按照以下步骤操作:

  • 创建用于存储视图的单独数据集
  • 在新数据集中创建视图
  • 向项目分配访问权限控制
  • 向包含视图的数据集分配访问权限控制
  • 向视图授予访问源数据集的权限

创建源数据集

首先,创建一个数据集来存储源数据。在本教程中,您将通过查询 GitHub 公开数据集填充源数据集中的表。源数据集中的数据包含您不希望数据分析师看到的信息。因此,您使用已获授权的视图来限制对数据的访问。

要创建源数据集,请执行以下操作:

Console

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

  2. 在导航面板的资源部分中,选择您的项目并点击创建数据集

  3. 对于数据集 ID,输入 github_source_data

  4. 保留所有其他默认设置不变,然后点击创建数据集

Python

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

from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = 'github_source_data'

source_dataset = bigquery.Dataset(client.dataset(source_dataset_id))
# Specify the geographic location where the dataset should reside.
source_dataset.location = 'US'
source_dataset = client.create_dataset(source_dataset)  # API request

创建源数据集后,您可以使用 SQL 查询在其中填充表。此查询从 GitHub 公开数据集中检索数据。

Console

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

  2. 点击编写新查询

  3. 复制以下查询并粘贴到查询编辑器文本区域中。

    SELECT
      commit,
      author,
      committer,
      repo_name
    FROM
      `bigquery-public-data.github_repos.commits`
    LIMIT
      1000
    
  4. 点击更多,然后选择查询设置

  5. 目标部分中,选中为查询结果设置目标表复选框。

    • 项目名称部分中,验证是否已选定您的项目。
    • 数据集名称部分中,验证是否已选中 github_source_data
    • 表名称部分中,输入 github_contributors
    • 点击保存

  6. 点击运行

  7. 完成查询后,点击 github_contributors,然后点击预览,验证数据是否已写入表中。

Python

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

source_table_id = 'github_contributors'
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish

创建单独的数据集以存储视图

创建源数据集后,您可以新建一个数据集来存储要与数据分析师共享的视图。该视图将有权访问源数据集中的数据。您的数据分析师将有权访问视图,但无法访问源数据。

创建视图时,必须在与视图查询的源数据不同的数据集中创建该视图。您只能在数据集级层分配访问权限控制,因此如果在与源数据相同的数据集中创建视图,您的数据分析师将有权同时访问视图和数据。

要创建用于存储视图的数据集,请执行以下操作:

Console

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

  2. 在导航面板的资源部分中,选择您的项目并点击创建数据集

  3. 对于数据集 ID,输入 shared_views

  4. 保留所有其他默认设置不变,然后点击创建数据集

Python

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

shared_dataset_id = 'shared_views'
shared_dataset = bigquery.Dataset(client.dataset(shared_dataset_id))
shared_dataset.location = 'US'
shared_dataset = client.create_dataset(shared_dataset)  # API request

在新数据集中创建视图

在新数据集中,您可以创建想要授权的视图,即您与数据分析师共享的视图。该视图是使用 SQL 查询创建的,其中未包含您不希望数据分析师看到的列。

在本教程中,您的共享视图不包含除作者姓名以外的所有作者信息,且不包含除提交者姓名以外的所有提交者信息。

要在新数据集中创建视图,请执行以下操作:

Console

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

  2. 点击编写新查询

  3. 复制以下查询并粘贴到查询编辑器文本区域中。将 project_id 替换为您的项目 ID

    SELECT
      commit,
      author.name as author,
      committer.name as committer,
      repo_name
    FROM
      `project_id.github_source_data.github_contributors`
    
  4. 点击更多,然后选择查询设置

  5. SQL 方言下选择标准。点击保存以更新查询设置。

  6. 点击保存视图

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

    • 项目名称部分中,验证是否已选定您的项目。
    • 数据集名称部分中,验证是否已选中 shared_views
    • 表名称部分中,输入 github_analyst_view
    • 点击保存

Python

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

shared_view_id = 'github_analyst_view'
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id)
view = client.create_table(view)  # API request

向数据分析师分配项目级层的 Cloud IAM 角色

为查询视图,您的数据分析师需要具有运行查询作业的权限。bigquery.user 角色具备在项目中运行作业(包括查询作业)的权限。如果您向用户或群组授予项目级层的 bigquery.user 角色,则用户可创建数据集,并可针对这些数据集中的表运行查询作业。bigquery.user 角色不针对用户尚未创建的数据集授予用户查询数据、查看表数据或查看表架构详细信息的权限。

向数据分析师分配项目级层的 bigquery.user 角色后,他们并不能够在包含视图查询的表的数据集中查看或查询表数据。应该向企业中的大多数人(数据科学家、商业智能分析师和数据分析师)分配项目级层的 bigquery.user 角色。

在本教程中,您的数据分析师位于名为 data_analysts@example.com 的群组中。该群组名称仅用作举例。当您将群组添加到 IAM 角色时,电子邮件地址和网域必须与有效的 Google 帐号或 Google Apps 帐号关联。

要将数据分析师群组分配给项目级层的 bigquery.user 角色,请执行以下操作:

Console

  1. 在 Google Cloud Platform Console 中打开 IAM 页面。

    打开 IAM 页面

  2. 点击选择项目

  3. 选择您的项目,然后点击打开

  4. IAM 页面上,点击添加

  5. 添加成员对话框中,执行以下操作:

    • 对于成员,输入群组名称 data_analysts@example.com
    • 对于角色,点击选择角色,然后选择 BigQuery > BigQuery 用户
    • 点击添加

向包含视图的数据集分配访问权限控制

为了让数据分析师能够查询视图,需要向他们授予针对包含该视图的数据集的 bigquery.dataViewer 角色。bigquery.user 角色为您的数据分析师提供创建查询作业所需的权限,但他们无法成功查询视图,除非他们还至少拥有对包含该视图的数据集的 bigquery.dataViewer 访问权限。

为数据分析师提供对数据集的 bigquery.dataViewer 访问权限:

Console

  1. 资源部分,选择 shared_views 数据集,然后点击共享数据集

  2. 数据集权限面板中,点击添加成员

  3. 新成员文本框中键入 data_analysts@example.com

  4. 点击选择角色,然后选择 BigQuery > BigQuery Data Viewer

  5. 点击完成

Python

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

# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry('READER', 'groupByEmail', analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ['access_entries'])  # API request

向视图授予访问源数据集的权限

当您为包含视图的数据集创建访问权限控制后,会将视图添加为源数据集中已获授权的视图。这样,视图就可访问源数据,而数据分析师群组则无法访问。

要向视图授予访问源数据的权限,请执行以下操作:

Console

  1. 资源中选择 github_source_data 数据集,然后点击共享数据集

  2. 数据集权限面板中,点击已获授权的视图标签页。

  3. 共享已获授权的视图下:

    • 选择项目部分中,验证是否已选定您的项目。
    • 对于选择数据集,选择 shared_views
    • 对于选择视图,输入视图名称:github_analyst_view
    • 点击确定

  4. 点击添加,然后点击完成

Python

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

access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, 'view', view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ['access_entries'])  # API request

验证配置

配置完成后,data_analysts 群组的成员可以通过查询视图来验证配置。

要验证配置,请执行以下操作:

Console

  1. data_analysts 群组的一名成员在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

  3. 复制以下查询并粘贴到查询编辑器文本区域中。

    SELECT
      *
    FROM
      `shared_views.github_analyst_view`
    

完整源代码

以下是本教程的完整源代码,供您参考。

Python

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

# Create a source dataset
from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = 'github_source_data'

source_dataset = bigquery.Dataset(client.dataset(source_dataset_id))
# Specify the geographic location where the dataset should reside.
source_dataset.location = 'US'
source_dataset = client.create_dataset(source_dataset)  # API request

# Populate a source table
source_table_id = 'github_contributors'
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish

# Create a separate dataset to store your view
shared_dataset_id = 'shared_views'
shared_dataset = bigquery.Dataset(client.dataset(shared_dataset_id))
shared_dataset.location = 'US'
shared_dataset = client.create_dataset(shared_dataset)  # API request

# Create the view in the new dataset
shared_view_id = 'github_analyst_view'
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id)
view = client.create_table(view)  # API request

# Assign access controls to the dataset containing the view
# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry('READER', 'groupByEmail', analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ['access_entries'])  # API request

# Authorize the view to access the source dataset
access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, 'view', view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ['access_entries'])  # API request

清理

为避免因本教程中使用的资源而导致我们向您的 Google Cloud Platform 帐号收取费用,请执行以下操作:

  1. 在 GCP Console 中,转到项目页面。

    转到“项目”页面

  2. 在项目列表中,选择您要删除的项目,然后点击删除 delete
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤

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

发送以下问题的反馈:

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