將資料匯出至 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 的資料表,且父項資料列不存在,匯出作業就會失敗,並顯示「父項資料列遺漏。資料列無法寫入」錯誤訊息。如果匯出的資料列寫入具有外鍵限制的資料表,且參照不存在的鍵,匯出作業就會失敗,並顯示「違反外鍵限制」錯誤。匯出至多個資料表時,建議您依序匯出,確保匯出作業可維持參照完整性。這通常表示在匯出參照外鍵的資料表之前,先匯出父項資料表和參照這些資料表的資料表。

    如果匯出目標的資料表設有外鍵限制,或是為其他資料表的子項 (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 (選用):寫入要求的優先順序。允許的值:LOWMEDIUMHIGH。預設值: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 定價