將資料匯出至 Spanner (反向 ETL)
本文說明如何設定從 BigQuery 到 Spanner 的反向擷取、轉換及載入 (反向 ETL) 工作流程。如要執行這項操作,請使用 EXPORT DATA
陳述式,將資料從 BigQuery 資料表匯出至 Spanner 資料表。
這項反向 ETL 工作流程結合了 BigQuery 的分析功能,以及 Spanner 的低延遲和高總處理量特性。這個工作流程可讓您將資料提供給應用程式使用者,同時避免 BigQuery 的配額和限制用盡。
事前準備
建立 Spanner 資料庫,包括接收匯出資料的資料表。
授予身分與存取權管理 (IAM) 角色,讓使用者擁有執行本文各項工作所需的權限。
建立企業或更高等級的預留項目。 如果將基準運算單元容量設為零並啟用自動調度資源,在將資料一次性匯出至 Spanner 時,或許能降低 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,但父項資料列不存在,匯出作業就會失敗,並顯示「Parent row is missing. 無法寫入資料列」錯誤。如果匯出的資料列寫入的資料表具有外鍵限制,且參照的鍵不存在,匯出作業就會失敗,並顯示「違反外鍵限制」錯誤。匯出至多個資料表時,建議您依序匯出,確保匯出作業維持參照完整性。這通常表示要先匯出父項資料表和外鍵參照的資料表,再匯出參照這些資料表的資料表。
如果匯出目標資料表有外鍵限制,或是另一個資料表的子項 (INTERLEAVE IN PARENT),則必須先填入父項資料表,再匯出子項資料表,且父項資料表應包含所有對應的鍵。如果父項資料表沒有完整的相關鍵集,嘗試匯出子項資料表就會失敗。
匯出至 Spanner 的工作最多可執行 6 小時。 如要瞭解如何最佳化大型匯出工作,請參閱「匯出最佳化」。或者,您也可以考慮將輸入內容分割成個別資料區塊,然後以個別匯出工作匯出。
只有 BigQuery Enterprise 或 Enterprise Plus 版本支援匯出至 Spanner。不支援 BigQuery Standard 版和隨選運算。
使用 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 類型 | 扳手類型 |
---|---|
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 定價。