將資料匯出至 Spanner (反向 ETL)

本文說明如何設定從 BigQuery 到 Spanner 的反向擷取、轉換及載入 (反向 ETL) 工作流程。如要執行這項操作,請使用 EXPORT DATA 陳述式,將資料從 BigQuery 資料表匯出至 Spanner 資料表。

這項反向 ETL 工作流程結合了 BigQuery 的分析功能,以及 Spanner 的低延遲和高總處理量特性。這個工作流程可讓您將資料提供給應用程式使用者,同時避免 BigQuery 的配額和限制用盡。

事前準備

必要的角色

如要取得將 BigQuery 資料匯出至 Spanner 的必要權限,請要求管理員在專案中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

限制

  • Assured Workloads 不支援這項功能。

  • 下列 BigQuery 資料類型在 Spanner 中沒有對應項目,因此不支援:

Spanner 資料庫方言 不支援的 BigQuery 類型
所有方言
  • STRUCT
  • GEOGRAPHY
  • DATETIME
  • RANGE
  • TIME
GoogleSQL
  • BIGNUMERIC:支援的 NUMERIC 類型不夠廣泛。建議在查詢中將明確型別轉換新增至 NUMERIC 型別。
  • 匯出資料列的大小上限為 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 (選用): 寫入要求的優先順序。允許的值:LOWMEDIUMHIGH。預設值: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 定價