將資料匯出至 AlloyDB (反向 ETL)
本文說明如何設定從 BigQuery 到 AlloyDB for PostgreSQL 的反向擷取、轉換及載入 (反向 ETL) 工作流程。您可以使用 EXPORT DATA 陳述式執行這項操作。
事前準備
建立 AlloyDB 叢集和執行個體,包括資料庫、結構定義和資料表,以接收匯出的資料。執行匯出作業前,您必須擁有目標結構定義和資料表。
目標 AlloyDB 執行個體必須是
PRIMARY執行個體,且處於READY狀態。建立 BigQuery 連線,連線至 AlloyDB 執行個體。連線必須透過使用者名稱和密碼進行驗證。連線中指定的資料庫使用者必須具備目標資料表的
INSERT權限和目標結構定義的USAGE權限。授予身分與存取權管理 (IAM) 角色,讓使用者擁有執行本文中各項工作所需的權限。
必要的角色
如要取得將 BigQuery 資料匯出至 AlloyDB 所需的權限,請要求系統管理員在專案中授予您下列 IAM 角色:
-
從 BigQuery 資料表匯出資料:
BigQuery 資料檢視者 (
roles/bigquery.dataViewer) -
執行擷取作業:
BigQuery 使用者 (
roles/bigquery.user) -
使用 BigQuery 連線:
BigQuery 連線使用者 (
roles/bigquery.connectionUser) -
連線至 AlloyDB 執行個體:
AlloyDB 用戶端 (
roles/alloydb.client) - 連線服務帳戶
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
限制
AlloyDB 匯出作業僅支援批次匯出。您無法使用連續查詢匯出至 AlloyDB。
匯出至 AlloyDB 的資料只會以新資料列的形式新增,匯出程序不會修改或刪除 AlloyDB 中的現有記錄。如果目標資料表未定義
PRIMARY KEY或UNIQUE限制,多次匯出相同資料會導致項目重複。為確保資料完整性,建議您在 AlloyDB 資料表上定義
PRIMARY KEY或UNIQUE限制。匯出工作不會執行「upsert」,也就是在有相符的專屬鍵時更新現有記錄。如有任何傳入的資料列違反PRIMARY KEY或UNIQUE限制,整個匯出工作就會失敗。我們不建議對同一個 AlloyDB 表格執行多個並行
EXPORT DATA工作。否則可能會導致無法預測的行為,例如資料遺失或工作失敗。建議您確認一次只有一個匯出工作會寫入特定資料表。系統僅支援透過 BigQuery 連線進行使用者名稱和密碼驗證。
不支援
ARRAY、BYTES、GEOGRAPHY、INTERVAL和STRUCTBigQuery 資料類型。如果 BigQuery
SELECT陳述式省略目標 AlloyDB 資料表中存在的資料欄,這些資料欄必須允許NULL值,或在 AlloyDB 中定義預設值。如果這些欄位有NOT NULL限制,且沒有預設值,匯出作業就會失敗。只有 BigQuery Enterprise 或 Enterprise Plus 版本支援匯出至 AlloyDB。不支援 BigQuery Standard 版和隨選運算。詳情請參閱「管理功能」。
BigQuery 工作 (例如擷取至 AlloyDB 的工作) 的時間上限為 6 小時。如果匯出作業的資料量非常大,建議您將匯出作業拆分成多個較小的作業。
位置注意事項
將資料匯出至 AlloyDB 時,BigQuery 資料集和 AlloyDB 執行個體的位置須符合特定規定:
同區域匯出:目標 AlloyDB 執行個體必須與 BigQuery 資料集位於完全相同的 Google Cloud 區域。舉例來說,
us-east1中的資料集只能匯出至us-east1中的 AlloyDB 執行個體。多區域匯出:
US多區域中的資料集只能匯出至us-central1區域的 AlloyDB 執行個體。EU多區域中的資料集只能匯出至europe-west4區域的 AlloyDB 執行個體。
系統不支援上述組合以外的跨區域匯出作業。
使用 alloydb_options 設定匯出作業
您可以使用 alloydb_options 選項指定目標 AlloyDB 結構定義、資料表和連線上限。設定會以 JSON 字串表示。只有 table 參數為必填,其他參數皆為選填。
設定匯出作業時,SELECT 陳述式中的資料欄必須有別名,且別名與目標 AlloyDB 資料表中的資料欄名稱相符。
EXPORT DATA WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_ID` OPTIONS( format='ALLOYDB', uri="https://alloydb.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_ID/instances/INSTANCE_ID", alloydb_options="""{ "schema": "SCHEMA_NAME", "table": "TABLE_NAME", "max_parallel_connections":MAX_CONNECTIONS}""" ) AS SELECT * FROM `mydataset.table1`;
更改下列內容:
PROJECT_ID:您 Google Cloud 專案的名稱。LOCATION:連線和目標執行個體的位置。CONNECTION_ID:BigQuery 連線的名稱。CLUSTER_ID:AlloyDB 叢集名稱。INSTANCE_ID:目標 AlloyDB 執行個體的名稱。SCHEMA_NAME(選用):AlloyDB 中目的地結構定義的名稱。如未提供,系統會使用為資料庫使用者設定的預設結構定義。TABLE_NAME:AlloyDB 中現有目的地資料表的名稱,不含結構定義前置字元。MAX_CONNECTIONS(選用):BigQuery 工作人員與 AlloyDB 執行個體之間並行連線的數量上限。限制連線可避免在大量匯出期間,目標執行個體過度負載。
匯出資料
您可以使用 EXPORT DATA 陳述式,將資料從 BigQuery 資料表匯出至 AlloyDB 資料表。
以下範例會將名為 mydataset.table1 的資料表中的選定欄位,匯出至名為 my_target_table 的 AlloyDB 資料表:
EXPORT DATA WITH CONNECTION `myproject.us-central1.my-alloydb-conn` OPTIONS ( format='ALLOYDB', uri="https://alloydb.googleapis.com/v1/projects/myproject/locations/us-central1/clusters/my-cluster/instances/my-instance", alloydb_options="""{ "schema": "public", "table": "my_target_table" }""" ) AS SELECT col1 AS id, col2 AS name, col3 AS value FROM `mydataset.table1`;
定價
使用 EXPORT DATA 陳述式將資料匯出至 AlloyDB 時,系統會按照 BigQuery 容量運算定價計費。
匯出資料之後,系統會因您在 AlloyDB 中儲存資料而向您收取費用。詳情請參閱 AlloyDB for PostgreSQL 定價。