建立 Spanner 外部資料集
本文件說明如何在 BigQuery 中建立外部資料集 (也稱為聯合資料集),並連結至 Spanner 中現有的資料庫。
外部資料集是 BigQuery 與外部資料來源之間的資料集層級連結。您可以使用 GoogleSQL 查詢 Spanner 資料庫中的交易資料,不必將所有資料從 Spanner 複製或匯入 BigQuery 儲存空間。這些查詢結果會儲存在 BigQuery 中。
外部資料集中的資料表會從對應外部資料來源中的資料表自動填入。您可以在 BigQuery 中直接查詢這些資料表,但無法進行修改、新增或刪除。不過,您在外部資料來源中所做的任何更新都會自動反映在 BigQuery 中。
查詢 Spanner 時,查詢結果預設會儲存在臨時資料表中。您也可以選擇將這些資料儲存為新的 BigQuery 資料表、與其他資料表彙整,或使用 DML 與現有資料表合併。
所需權限
如要取得建立外部資料集所需的權限,請要求管理員授予您「BigQuery 使用者」 (roles/bigquery.user
) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這個預先定義的角色包含 bigquery.datasets.create
權限,這是建立外部資料集所需的權限。
如要進一步瞭解 BigQuery 中的 IAM 角色和權限,請參閱「IAM 簡介」。
使用 CLOUD_RESOURCE
連線
您可以選擇讓 Spanner 外部資料集使用 CLOUD_RESOURCE
連線與 Spanner 資料庫互動,這樣一來,您就能讓使用者透過 BigQuery 存取 Spanner 資料,而不需要直接存取 Spanner 資料庫。由於 CLOUD_RESOURCE
連線的服務帳戶會處理從 Spanner 擷取資料,因此您只需授予使用者 Spanner 外部資料集的存取權。
使用 CLOUD_RESOURCE
連線建立 Spanner 外部資料集之前,請先執行下列操作:
建立連線
您可以建立或使用現有的 CLOUD_RESOURCE
連線,連線至 Spanner。如要建立 Cloud 資源連線,請按照「建立 Cloud 資源連線」頁面上的步驟操作。
建立連線後,請開啟該連線,然後在「連線資訊」窗格中複製服務帳戶 ID。設定連線權限時,您需要使用這個 ID。建立連線資源時,BigQuery 會建立專屬的系統服務帳戶,並將該帳戶與連線建立關聯。
設定存取權
您必須為新連線提供 Spanner 執行個體或資料庫的讀取權限。建議您使用 Cloud Spanner 資料庫讀取者 (使用 Data Boost) (roles/spanner.databaseReaderWithDataBoost
) 預先定義的 IAM 角色。
請按照下列步驟,為先前從連線複製的服務帳戶授予資料庫層級角色存取權:
前往 Spanner「Instances」頁面。
點選包含您的資料庫的執行個體名稱,前往「執行個體詳細資料」頁面。
在「Overview」分頁中,選取資料庫的核取方塊。
「Info」面板隨即顯示。按一下「新增主體」。
在「新增主體」面板的「新增主體」中,輸入先前複製的服務帳戶 ID。
在「請選擇角色」欄位中,選取「Cloud Spanner 資料庫讀取者 (使用 DataBoost)」角色。
按一下 [儲存]。
建立外部資料集
如要建立外部資料集,請按照下列步驟操作:
主控台
在 Google Cloud 控制台開啟「BigQuery」頁面。
在「Explorer」面板中,選取要建立資料集的專案。
展開
「動作」選項,然後點選「建立資料集」。在「Create dataset」頁面上執行下列操作:
- 針對「Dataset ID」(資料集 ID),輸入唯一的資料集名稱。
- 針對「Location type」(位置類型),選擇資料集的位置,例如
us-central1
或多區域us
。資料集建立後,就無法變更位置。 如要使用「外部資料集」,請執行下列操作:
- 勾選「外部資料集的連結」旁的方塊。
- 在「External dataset type」(外部資料集類型) 中,選取
Spanner
。 - 在「外部來源」中,請使用下列格式輸入 Spanner 資料庫的完整 ID:
projects/PROJECT_ID/instances/INSTANCE/databases/DATABASE
。例如:projects/my_project/instances/my_instance/databases/my_database
。 - 您可以選擇在「資料庫角色」中輸入 Spanner 資料庫角色的名稱。如需更多資訊,請參閱建立 Spanner 連線時使用的資料庫角色。
- 您可以視需要勾選「使用 Cloud 資源連線」旁的方塊,藉此透過連線建立外部資料集。
保留其他預設設定。
點選「建立資料集」。
SQL
使用 CREATE EXTERNAL SCHEMA
資料定義語言 (DDL) 陳述式。
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入以下陳述式:
CREATE EXTERNAL SCHEMA DATASET_NAME OPTIONS ( external_source = 'SPANNER_EXTERNAL_SOURCE', location = 'LOCATION'); /* Alternatively, create with a connection: */ CREATE EXTERNAL SCHEMA DATASET_NAME WITH CONNECTION
PROJECT_ID.LOCATION.CONNECTION_NAME
OPTIONS ( external_source = 'SPANNER_EXTERNAL_SOURCE', location = 'LOCATION');請依指示取代下列項目:
DATASET_NAME
:BigQuery 中新資料集的名稱。SPANNER_EXTERNAL_SOURCE
:完整且經過完整指定的 Spanner 資料庫名稱,其中包含識別來源的前置字串,格式如下:google-cloudspanner://[DATABASE_ROLE@]/projects/PROJECT_ID/instances/INSTANCE/databases/DATABASE
。例如google-cloudspanner://admin@/projects/my_project/instances/my_instance/databases/my_database
或google-cloudspanner:/projects/my_project/instances/my_instance/databases/my_database
。LOCATION
:新資料集在 BigQuery 中的位置,例如us-central1
。建立資料集後,就無法變更位置。- (選用)
CONNECTION_NAME
:Cloud 資源連線的名稱。
按一下
「Run」。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」一文。
bq
在指令列環境中,使用 bq mk
指令建立外部資料集:
bq --location=LOCATION mk --dataset \ --external_source SPANNER_EXTERNAL_SOURCE \ DATASET_NAME
或者,您也可以使用連線建立:
bq --location=LOCATION mk --dataset \ --external_source SPANNER_EXTERNAL_SOURCE \ --connection_id PROJECT_ID.LOCATION.CONNECTION_NAME \ DATASET_NAME
更改下列內容:
LOCATION
:新資料集在 BigQuery 中的所在位置,例如us-central1
。建立資料集後,您就無法變更位置。您可以使用.bigqueryrc
檔案設定預設位置值。SPANNER_EXTERNAL_SOURCE
:完整且經過修飾的 Spanner 資料庫名稱,其中包含識別來源的前置字串,格式如下:google-cloudspanner://[DATABASE_ROLE@]/projects/PROJECT_ID/instances/INSTANCE/databases/DATABASE
。例如google-cloudspanner://admin@/projects/my_project/instances/my_instance/databases/my_database
或google-cloudspanner:/projects/my_project/instances/my_instance/databases/my_database
。DATASET_NAME
:BigQuery 中新資料集的名稱。如要在非預設專案中建立資料集,請採用下列格式將專案 ID 新增至資料集:PROJECT_ID
:DATASET_NAME
。- (選用)
CONNECTION_NAME
:Cloud 資源連線的名稱。
Terraform
使用 google_bigquery_dataset
資源。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
以下範例會建立 Spanner 外部資料集:
如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節中的步驟。
準備 Cloud Shell
- 啟動 Cloud Shell。
-
設定要套用 Terraform 設定的預設 Google Cloud 專案。
您只需為每個專案執行這個指令一次,而且可以在任何目錄中執行。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 設定檔中設定明確的值,系統就會覆寫環境變數。
準備目錄
每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。
-
在 Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱必須包含
.tf
副檔名,例如main.tf
。在本教學課程中,檔案稱為main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您正在參考教學課程,可以複製各個章節或步驟中的程式碼範例。
將範例程式碼複製到新建立的
main.tf
中。您可以視需要從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您採用這種做法。
- 查看並修改要套用至環境的範例參數。
- 儲存變更。
-
初始化 Terraform。這項操作只需對每個目錄執行一次。
terraform init
如要使用最新版的 Google 供應器,您可以選擇加入
-upgrade
選項:terraform init -upgrade
套用變更
-
檢查設定,確認 Terraform 要建立或更新的資源符合您的預期:
terraform plan
視需要修正設定。
-
執行下列指令,並在提示中輸入
yes
,即可套用 Terraform 設定:terraform apply
等待 Terraform 顯示「Apply complete!」(套用完成) 訊息。
- 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。
API
請呼叫 datasets.insert
方法,搭配 Spanner 資料庫的已定義資料集資源和 externalDatasetReference
欄位。
請注意,外部資料集中的資料表名稱不區分大小寫。
使用 CLOUD_RESOURCE
連線建立外部資料集時,您必須具備外部資料集所使用的連線的 bigquery.connections.delegate
權限 (可透過 BigQuery 連線管理員角色取得)。
控管資料表的存取權
Spanner 外部資料集支援使用者憑證 (EUC)。也就是說,外部資料集對 Spanner 資料表的存取權由 Spanner 控管。只有獲得 Spanner 存取權的使用者才能查詢這些資料表。
Spanner 外部資料集也支援存取權委派。存取權委派功能可將 Spanner 資料表的存取權,與外部資料集和基礎 Spanner 資料表的直接存取權分開。與服務帳戶相關聯的 Cloud 資源連線會用來連線至 Spanner。即使使用者未獲得 Spanner 存取權,仍可透過外部資料集查詢這些 Spanner 資料表。
列出外部資料集中的資料表
如要列出可在外部資料集中查詢的資料表,請參閱列出資料集。
取得資料表資訊
如要取得外部資料集中的資料表相關資訊 (例如結構定義詳細資料),請參閱「取得資料表資訊」一文。
查詢 Spanner 資料
在外部資料集中查詢資料表的做法與在任何其他 BigQuery 資料集中查詢資料表相同。但不支援資料修改作業 (DML)。
針對 Spanner 外部資料集中的資料表進行查詢時,預設會使用 Data Boost,且無法變更。因此,您需要其他權限才能執行這類查詢。
在外部資料集中建立檢視表
您無法在外部資料集中建立檢視畫面。不過,您可以在標準資料集中建立以外部資料集中的資料表為基礎的檢視畫面。詳情請參閱「建立檢視表」。
刪除外部資料集
刪除外部資料集的操作與刪除任何其他 BigQuery 資料集相同。刪除外部資料集不會影響 Spanner 資料庫中的資料表。詳情請參閱「刪除資料集」。
限制
- 適用 BigQuery 聯合查詢限制。
- 在 BigQuery 中,您只能存取預設 Spanner 結構定義的資料表。系統不支援名稱結構定義中的資料表。
- BigQuery 無法顯示在 Spanner 資料庫中定義的主鍵和外鍵。
- 如果 Spanner 資料庫中的資料表含有 BigQuery 不支援的資料欄類型,則 BigQuery 端無法存取這個資料欄。
- 您無法在 Spanner 外部資料集中新增、刪除或更新資料表或中繼資料。
- 您無法在 Spanner 外部資料集中建立新的資料表、檢視表或物化檢視表。
- 系統不支援
INFORMATION_SCHEMA
檢視。 - 不支援中繼資料快取。
- 資料集層級的資料表建立預設值設定不會影響外部資料集,因為您無法手動建立資料表。
- 系統不支援使用 PostgreSQL 方言的 Spanner 資料庫。
- 不支援 Write API 和 Read API。
- 不支援資料列層級安全性、資料欄層級安全性和資料遮罩。
- 系統不支援以 Spanner 外部資料集的資料表為基礎的具體化檢視表。
- 不支援與 Dataplex Universal Catalog 整合。例如,系統不支援資料設定檔和資料品質掃描。
- 不支援表格層級的代碼。
- 編寫查詢時,SQL 自動完成功能無法與 Spanner 外部資料表搭配使用。
- 透過 Sensitive Data Protection 掃描不支援外部資料集。
- 外部資料集不支援透過 BigQuery sharing (舊稱 Analytics Hub) 共用資料。
- 如果 Spanner 外部資料集使用使用者憑證 (EUC),您可以建立參照外部資料集的授權檢視畫面。不過,當您查詢這個檢視畫面時,執行查詢的使用者 EUC 會傳送至 Spanner。
- 如果 Spanner 外部資料集使用 Cloud 資源連線來委派存取權,您可以建立參照外部資料集的授權檢視畫面或例行程序。
後續步驟
- 進一步瞭解 Spanner 聯合查詢。