创建视图

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

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

  • 使用 Google Cloud 控制台。
  • 使用 bq 命令行工具的 bq mk 命令。
  • 调用 tables.insert API 方法。
  • 使用客户端库。
  • 提交 CREATE VIEW 数据定义语言 (DDL) 语句。

视图限制

BigQuery 视图存在如下限制:

  • 视图是只读的。 例如,您无法运行插入、更新或删除数据的查询。
  • 包含视图的数据集与包含视图所引用表的数据集必须位于相同位置
  • 视图内的引用必须使用数据集进行限定。默认数据集不会影响视图正文。
  • 您无法使用 TableDataList JSON API 方法从视图中检索数据。如需了解详情,请参阅 Tabledata: list
  • 使用视图时,不能混合使用 GoogleSQL 查询和旧版 SQL 查询。GoogleSQL 查询无法引用使用旧版 SQL 语法定义的视图。
  • 无法在视图中引用查询参数
  • 创建视图时,基础表的架构与视图一同存储。如果在视图创建后添加、删除或修改列,则在视图更新之前,报告的架构可能不准确。尽管系统报告的架构可能会不准确,但所有已提交的查询都会产生准确的结果。
  • 您无法自动将旧版 SQL 视图更新为 GoogleSQL 语法。如需修改用于定义视图的查询,您可以使用以下各项:
  • 您无法在定义视图的 SQL 查询中包含用户定义的临时性函数或临时表。
  • 您无法在通配符表查询中引用视图。

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

准备工作

授予为用户提供执行本文档中的每个任务所需权限的 Identity and Access Management (IAM) 角色。

所需权限

在 BigQuery 中,视图作为表资源进行处理,因此创建视图所需的权限与创建表相同。您还必须拥有查询视图的 SQL 查询所引用的任何表的权限。

如需创建视图,您需要拥有 bigquery.tables.create IAM 权限。预定义的 IAM 角色 roles/bigquery.dataEditor 可提供创建视图所需的权限。

此外,如果您拥有 bigquery.datasets.create 权限,则可以在自己创建的数据集中创建视图。如需针对非自己拥有的数据创建视图,您必须拥有表的 bigquery.tables.getData 权限。

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

视图命名

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

  • 包含的字符总数不超过 1024 个 UTF-8 字节。
  • 包含类别 L(字母)、M(符号)、N(数字)、Pc(连接符,包括下划线)、Pd(短划线)、Zs(空格)中的 Unicode 字符。如需了解详情,请参阅常规类别

以下是有效视图名称的所有示例:view 01ग्राहक00_お客様étudiant-01

注意事项:

  • 默认情况下,表名称区分大小写。mytableMyTable 可以位于同一数据集中,除非它们属于关闭区分大小写的数据集
  • 某些视图名称和视图名称前缀已预留。如果您收到错误,表示您的视图名称或前缀已被预留,请选择其他名称并重试。
  • 如果您在序列中添加多个点运算符 (.),则系统会隐式删除重复的运算符。

    例如,project_name....dataset_name..table_name

    会变为 project_name.dataset_name.table_name

创建视图

要创建视图,您可以编写 SQL 查询来定义视图可访问的数据。 SQL 查询必须包含 SELECT 语句。视图查询中不允许使用其他语句类型(例如 DML 语句)和多语句查询

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

控制台

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

    保存视图。

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

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

SQL

使用 CREATE VIEW 语句。以下示例根据美国姓名公共数据集创建一个名为 usa_male_names 的视图:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    CREATE VIEW mydataset.usa_male_names(name, number) AS (
      SELECT
        name,
        number
      FROM
        bigquery-public-data.usa_names.usa_1910_current
      WHERE
        gender = 'M'
      ORDER BY
        number DESC
    );
    

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

使用带有 --view 标志的 bq mk 命令。对于 GoogleSQL 查询,请添加 --use_legacy_sql 标志并将其设置为 false。可选参数包括 --expiration--description--label

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

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

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

替换以下内容:

  • PATH_TO_FILE 是一个代码文件的 URI 或本地文件系统路径,该代码文件会被立即加载为 UDF 资源并评估,以供视图使用。重复使用该标志可指定多个文件。
  • INTEGER 设置视图的生命周期(以秒为单位)。如果 INTEGER0,则视图不会过期。如果不添加 --expiration 标志,则 BigQuery 将使用数据集的默认表生命周期来创建视图。
  • DESCRIPTION 是括在引号中的视图说明。
  • KEY:VALUE 是代表标签的键值对。重复使用 --label 标志以指定多个标签。
  • QUERY 是一个有效查询。
  • 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

输入以下命令可在 myotherprojectmydataset 中创建名为 myview 的视图。说明设置为 This is my view,标签设置为 organization:development,视图的到期时间设置为数据集的默认表到期时间。用于创建视图的查询会查询美国姓名数据公共数据集中的数据。

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

创建视图后,您可以更新视图的到期时间、说明和标签。如需了解详情,请参阅更新视图

Terraform

使用 google_bigquery_table 资源。

以下示例创建了一个名为 myview 的视图:

resource "google_bigquery_dataset" "default" {
  dataset_id                      = "mydataset"
  default_partition_expiration_ms = 2592000000  # 30 days
  default_table_expiration_ms     = 31536000000 # 365 days
  description                     = "dataset description"
  location                        = "US"
  max_time_travel_hours           = 96 # 4 days

  labels = {
    billing_group = "accounting",
    pii           = "sensitive"
  }
}

resource "google_bigquery_table" "default" {
  dataset_id          = google_bigquery_dataset.default.dataset_id
  table_id            = "myview"
  deletion_protection = false # set to "true" in production

  view {
    query          = "SELECT global_id, faa_identifier, name, latitude, longitude FROM `bigquery-public-data.faa.us_airports`"
    use_legacy_sql = false
  }

}

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

API

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

Go

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

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// createView demonstrates creation of a BigQuery logical view.
func createView(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydatasetid"
	// tableID := "mytableid"
	ctx := context.Background()

	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	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
	}
	return nil
}

Java

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

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableInfo;
import com.google.cloud.bigquery.ViewDefinition;

// Sample to create a view
public class CreateView {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String viewName = "MY_VIEW_NAME";
    String query =
        String.format(
            "SELECT TimestampField, StringField, BooleanField FROM %s.%s", datasetName, tableName);
    createView(datasetName, viewName, query);
  }

  public static void createView(String datasetName, String viewName, String query) {
    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, viewName);

      ViewDefinition viewDefinition =
          ViewDefinition.newBuilder(query).setUseLegacySql(false).build();

      bigquery.create(TableInfo.of(tableId, viewDefinition));
      System.out.println("View created successfully");
    } catch (BigQueryException e) {
      System.out.println("View was not created. \n" + e.toString());
    }
  }
}

Node.js

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

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

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

async function createView() {
  // Creates a new view named "my_shared_view" in "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const myDatasetId = "my_table"
  // const myTableId = "my_table"
  // const projectId = "bigquery-public-data";
  // const sourceDatasetId = "usa_names"
  // const sourceTableId = "usa_1910_current";
  const myDataset = await bigquery.dataset(myDatasetId);

  // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
  const options = {
    view: `SELECT name
    FROM \`${projectId}.${sourceDatasetId}.${sourceTableId}\`
    LIMIT 10`,
  };

  // Create a new view in the dataset
  const [view] = await myDataset.createTable(myTableId, options);

  console.log(`View ${view.id} created.`);
}

Python

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

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

from google.cloud import bigquery

client = bigquery.Client()

view_id = "my-project.my_dataset.my_view"
source_id = "my-project.my_dataset.my_table"
view = bigquery.Table(view_id)

# The source table in this example is created from a CSV file in Google
# Cloud Storage located at
# `gs://cloud-samples-data/bigquery/us-states/us-states.csv`. It contains
# 50 US states, while the view returns only those states with names
# starting with the letter 'W'.
view.view_query = f"SELECT name, post_abbr FROM `{source_id}` WHERE name LIKE 'W%'"

# Make an API request to create the view.
view = client.create_table(view)
print(f"Created {view.table_type}: {str(view.reference)}")

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

视图安全性

如需控制对 BigQuery 中视图的访问权限,请参阅授权视图

后续步骤