將資料匯出至 Spanner (反向 ETL)
本文件說明如何設定從 BigQuery 到 Spanner 的反向擷取、轉換及載入 (反向 ETL) 工作流程。您可以使用 EXPORT DATA
陳述式,將資料從 BigQuery 資料表匯出至 Spanner 資料表。
這個反向 ETL 工作流程結合了 BigQuery 的分析功能,以及 Spanner 的低延遲和高總處理量。這個工作流程可讓您為應用程式使用者提供資料,且不會耗盡 BigQuery 的配額和限制。
事前準備
建立 Spanner 資料庫,其中包含用來接收匯出資料的資料表。
授予身分與存取權管理 (IAM) 角色,讓使用者取得執行本文件中各項工作的必要權限。
建立 Enterprise 或更高層級的預留項目。如要執行一次性匯出作業,您可以將基準運算單元容量設為零並啟用自動調度資源,這樣就能降低 BigQuery 運算成本。
必要的角色
如要取得匯出 BigQuery 資料至 Spanner 所需的權限,請管理員為您的專案授予下列 IAM 角色:
-
從 BigQuery 資料表匯出資料:
BigQuery 資料檢視器 (
roles/bigquery.dataViewer
) -
執行匯出工作:
BigQuery 使用者 (
roles/bigquery.user
) -
檢查 Spanner 執行個體的參數:
Cloud Spanner 檢視器 (
roles/spanner.viewer
) -
將資料寫入 Spanner 資料表:
Cloud Spanner 資料庫使用者 (
roles/spanner.databaseUser
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
限制
Assured Workloads 不支援這項功能。
下列 BigQuery 資料類型在 Spanner 中沒有對應項目,因此不受支援:
Spanner 資料庫方言 | 不支援的 BigQuery 類型 |
---|---|
所有方言 |
|
GoogleSQL |
|
匯出的資料列大小不得超過 1 MiB。
Spanner 會在匯出期間強制執行參照完整性。如果目標資料表是另一個資料表的子項 (INTERLEAVE IN PARENT),或是目標資料表有外鍵限制,系統會在匯出期間驗證外鍵和父項鍵。如果匯出的資料列是寫入使用 INTERLEAVE IN PARENT 的資料表,且父項資料列不存在,匯出作業就會失敗,並顯示「父項資料列遺漏。資料列無法寫入」錯誤訊息。如果匯出的資料列寫入具有外鍵限制的資料表,且參照不存在的鍵,匯出作業就會失敗,並顯示「違反外鍵限制」錯誤。匯出至多個資料表時,建議您依序匯出,確保匯出作業可維持參照完整性。這通常表示在匯出參照外鍵的資料表之前,先匯出父項資料表和參照這些資料表的資料表。
如果匯出目標的資料表設有外鍵限制,或是為其他資料表的子項 (INTERLEAVE IN PARENT),則必須在匯出子項資料表前填入父項資料表,且應包含所有對應的鍵。如果父項資料表沒有完整的相關鍵組,嘗試匯出子項資料表就會失敗。
匯出至 Spanner 的工作最多可執行 6 小時。如要瞭解如何最佳化大型匯出工作,請參閱「匯出最佳化」一文。或者,您可以考慮將輸入內容拆分為個別資料區塊,以便匯出為個別匯出工作。
只有 BigQuery Enterprise 或 Enterprise Plus 版本支援匯出至 Spanner。不支援 BigQuery 標準版和隨選運算。
使用 spanner_options
選項設定匯出作業
您可以使用 spanner_options
選項指定目的地 Spanner 資料庫和資料表。設定以 JSON 字串的形式表示,如以下範例所示:
EXPORT DATA OPTIONS( uri="https://spanner.googleapis.com/projects/PROJECT_ID
/instances/INSTANCE_ID
/databases/DATABASE_ID
", format='CLOUD_SPANNER', spanner_options = """{ "table": "TABLE_NAME
", "priority": "PRIORITY
", "tag": "TAG
", }""" )
更改下列內容:
PROJECT_ID
: Google Cloud 專案名稱。INSTANCE_ID
:資料庫例項名稱。DATABASE_ID
:資料庫名稱。TABLE_NAME
:現有目標資料表的名稱。PRIORITY
(選用):寫入要求的優先順序。允許的值:LOW
、MEDIUM
、HIGH
。預設值:MEDIUM
。TAG
(選用):要求標記,協助在 Spanner 監控中識別匯出器流量。預設值:bq_export
。
匯出查詢的必要條件
如要將查詢結果匯出至 Spanner,結果必須符合下列條件:
- 結果集中的所有資料欄都必須存在於目的地資料表中,且類型必須相符或可轉換。
- 結果集必須包含目的地資料表的所有
NOT NULL
欄。 - 資料欄值不得超過 Spanner 資料表內的資料大小限制。
- 所有不支援的資料欄類型都必須先轉換為支援的類型,才能匯出至 Spanner。
類型轉換
為方便使用,Spanner 匯出器會自動套用下列類型轉換:
BigQuery 類型 | Spanner 類型 |
---|---|
BIGNUMERIC | NUMERIC (僅限 PostgreSQL 方言) |
FLOAT64 | FLOAT32 |
BYTES | PROTO |
INT64 | ENUM |
匯出資料
您可以使用 EXPORT DATA
陳述式,將資料從 BigQuery 資料表匯出至 Spanner 資料表。
以下範例會從名為 mydataset.table1
的資料表中匯出所選欄位:
EXPORT DATA OPTIONS ( uri="https://spanner.googleapis.com/projects/PROJECT_ID
/instances/INSTANCE_ID
/databases/DATABASE_ID
", format='CLOUD_SPANNER', spanner_options="""{ "table": "TABLE_NAME" }""" ) AS SELECT * FROM mydataset.table1;
更改下列內容:
PROJECT_ID
: Google Cloud 專案名稱INSTANCE_ID
:資料庫例項名稱DATABASE_ID
:資料庫名稱TABLE_NAME
:現有目的地資料表的名稱
匯出多個具有相同 rowkey
值的結果
當您匯出包含多個資料列的結果,且這些資料列具有相同的 rowkey
值時,寫入 Spanner 的值會最終出現在同一個 Spanner 資料列中。匯出作業產生的 Spanner 資料列組合中,只會出現單一相符的 BigQuery 資料列 (無法保證是哪一列)。
匯出最佳化
如要最佳化從 BigQuery 匯出至 Spanner 的記錄,您可以嘗試以下做法:
在 Spanner 目的地執行個體中增加節點數量。請注意,在匯出作業的初期階段,增加執行個體中的節點數量,可能不會立即提高匯出傳輸量。由於 Spanner 會執行以負載為依據的分割,因此可能會稍微延遲。使用負載分割功能後,匯出傳輸量會逐漸增加,並在短時間內穩定下來。如要進一步瞭解如何盡量提高寫入總處理量,請參閱「效能總覽」。
在
spanner_options
中指定HIGH
優先順序。不過,這麼做可能會導致同個執行個體提供的其他工作負載效能大幅降低。請勿排序查詢結果。如果結果集包含所有主鍵欄,匯出工具就會自動排序目的地資料表的主鍵,以便簡化寫入作業並盡量減少爭用情形。
如果目的地資料表的主鍵包含產生的欄,請將產生欄的運算式新增至查詢,確保匯出的資料能正確排序。
定價
將 BigQuery 匯出至跨區域邊界的 Spanner,系統會依據資料擷取費率收費。詳情請參閱 BigQuery 定價。為避免產生資料移轉費用,請確認 BigQuery 匯出作業是在 Spanner 預設領導節點所在的區域執行。
匯出資料之後,系統會因您在 Spanner 中儲存資料而向您收取費用。詳情請參閱 Spanner 定價。