建立邏輯檢視

本文說明如何在 BigQuery 中建立邏輯檢視表。

您可以透過下列方式建立邏輯檢視區塊:

  • 使用 Google Cloud 控制台。
  • 使用 bq 指令列工具的 bq mk 指令。
  • 呼叫 tables.insert API 方法
  • 使用用戶端程式庫。
  • 提交 CREATE VIEW 資料定義語言 (DDL) 陳述式。

資料檢視限制

BigQuery 資料檢視有下列幾項限制:

  • 檢視畫面為唯讀狀態。舉例來說,您無法執行插入、更新或刪除資料的查詢。
  • 包含檢視表的資料集,以及包含檢視表參照之資料表的資料集,必須位於同一個位置
  • 檢視表內的參照必須符合資料集資格。預設資料集不會影響檢視區塊主體。
  • 您無法使用 TableDataList JSON API 方法從檢視表擷取資料。詳情請參閱 Tabledata:list 的相關說明。
  • 使用檢視表時,不能混用 GoogleSQL 和舊版 SQL 查詢。GoogleSQL 查詢無法參照使用舊版 SQL 語法定義的檢視表。
  • 您無法在檢視表中參照查詢參數
  • 建立檢視表時,系統會將基礎資料表的結構定義和檢視表一併儲存。如果在檢視表建立後新增、刪除或修改資料欄,檢視表不會自動更新,且回報的結構定義會維持不正確,直到變更檢視表 SQL 定義或重新建立檢視表為止。不過即使回報的結構定義不正確,所有提交的查詢還是會產生正確的結果。
  • 您無法將舊版 SQL 檢視表自動更新為 GoogleSQL 語法。如要修改用來定義檢視表的查詢,可以使用下列項目:
  • 您無法在定義檢視表的 SQL 查詢中加入暫時性使用者定義函式或暫時性資料表。
  • 您無法在萬用字元資料表查詢中參照資料檢視。

如要瞭解檢視表適用的配額及限制,請參閱「檢視表限制」。

事前準備

授予身分與存取權管理 (IAM) 角色,讓使用者擁有執行本文件各項工作所需的權限。

所需權限

BigQuery 會將檢視表視為資料表資源,因此建立檢視表需要的權限和建立資料表相同。您還需擁有檢視表 SQL 查詢所參照的資料表查詢權限。

如要建立資料檢視,您需要 bigquery.tables.create IAM 權限。roles/bigquery.dataEditor 預先定義的 IAM 角色包含建立檢視區塊所需的權限。

此外,如果您具備 bigquery.datasets.create 權限,可以在您建立的資料集中建立檢視區塊。如要為不屬於您的資料建立檢視區塊,您必須具備該資料表的 bigquery.tables.getData 權限。

如要進一步瞭解 BigQuery 中的 IAM 角色和權限,請參閱預先定義的角色和權限

檢視表命名

在 BigQuery 中建立檢視表時,檢視表名稱在同一資料集中不得重複。以下是檢視表的命名規則:

  • 包含的字元總計最多 1,024 個 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. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 按一下「SQL 查詢」

  3. 在查詢編輯器中輸入有效的 SQL 查詢。

    或者,您也可以開啟已儲存的查詢

  4. 依序點按 「儲存」>「儲存檢視畫面」

    儲存檢視畫面。

  5. 在「Save view」(儲存檢視表) 對話方塊中:

    • 在「Project」選單中,選取要儲存檢視表的專案。
    • 在「資料集」選單中,選取資料集或建立新資料集來儲存檢視區塊。已儲存檢視表的目的地資料集必須與來源位於相同區域
    • 在「Table」(資料表) 欄位中,輸入檢視表的名稱。
    • 按一下 [儲存]

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

使用 bq mk 指令 並加上 --view 旗標。如果是 GoogleSQL 查詢,請加入 --use_legacy_sql 旗標,並將旗標設定為 false。可選用的參數包括 --add_tags--expiration--description--label。如需完整參數清單,請參閱 bq mk 指令參考資料。

如果查詢參照儲存在 Cloud Storage 或本機檔案中的外部使用者定義函式 (UDF) 資源,請使用 --view_udf_resource 旗標指定這些資源。本文不示範 --view_udf_resource 旗標。如要進一步瞭解如何使用 UDF,請參閱使用者定義函式

如果要在預設專案以外的專案中建立檢視表,請使用 --project_id 旗標來指定專案 ID。

bq mk \
--use_legacy_sql=false \
--view_udf_resource=PATH_TO_FILE \
--expiration=INTEGER \
--description="DESCRIPTION" \
--label=KEY_1:VALUE_1 \
--add_tags=KEY_2:VALUE_2[,...] \
--view='QUERY' \
--project_id=PROJECT_ID \
DATASET.VIEW

更改下列內容:

  • PATH_TO_FILE 是程式碼檔案的 URI 或本機檔案系統路徑,該檔案會做為檢視表使用的使用者定義函式資源,而立即載入並進行評估。請重複該標記以指定多個檔案。
  • INTEGER 會設定檢視區塊的生命週期 (以秒為單位)。如果 INTEGER0,檢視畫面就不會過期。如果未加入 --expiration 旗標,BigQuery 會使用資料集的預設資料表生命週期建立檢視區塊。
  • DESCRIPTION 是資料檢視的說明,會用引號括住。
  • KEY_1:VALUE_1 是代表標籤的鍵/值組合。重複使用 --label 旗標即可指定多個標籤。
  • KEY_2:VALUE_2 是代表標記的鍵/值組合。在同一個標記下新增多個標籤,並在鍵/值組合之間加上逗號。
  • 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

輸入下列指令,在 myotherproject 中的 mydataset 建立名為 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 資源。

如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證作業」。

下列範例會建立名為 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 顯示「Apply complete!」訊息。

  3. 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 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 中檢視區塊的存取權,請參閱「授權檢視區塊」。

後續步驟