設定 BigQuery 目的地

本頁說明如何設定 BigQuery 目的地,以便使用 Datastream 串流來源資料庫中的資料。

設定目的地資料集

設定 BigQuery 目的地的資料集時,您可以選取下列任一選項:

  • 針對每個結構定義建立資料集:系統會根據來源的結構定義名稱,在指定的 BigQuery 位置選取或建立資料集。因此,針對來源中的每個結構定義,Datastream 會自動在 BigQuery 中建立資料集。

    舉例來說,如果您有 MySQL 來源,且該來源包含 mydb 資料庫,以及資料庫內的 employees 資料表,那麼 Datastream 就會在 BigQuery 中建立 mydb 資料集和 employees 資料表。

    如果選取這個選項,Datastream 就會在包含串流的專案中建立資料集。雖然您不必在與串流相同的區域中建立資料集,但為了降低成本並提升效能,建議您將串流的所有資源和資料集都放在相同的區域。

  • 針對所有結構定義建立單一資料集:您可以為資料流選取 BigQuery 資料集。Datastream 會將所有資料串流至這個資料集。針對您選取的資料集,Datastream 會以 <schema>_<table> 的形式建立所有資料表。

    舉例來說,如果您有 MySQL 來源,且該來源包含 mydb 資料庫,以及資料庫中的 employees 資料表,那麼 Datastream 就會在您選取的資料集中建立 mydb_employees 資料表。

寫入行為

  • 將資料串流至 BigQuery 時,事件大小上限為 20 MB。

  • 設定串流時,您可以選取 Datastream 將變更資料寫入 BigQuery 的方式。詳情請參閱「設定寫入模式」。

設定寫入模式

您可以使用兩種模式,定義資料寫入 BigQuery 的方式:

  • Merge:這是預設的寫入模式。選取這項設定後,BigQuery 會反映資料在來源資料庫中的儲存方式。也就是說,Datastream 會將資料的所有變更寫入 BigQuery,然後 BigQuery 會將變更與現有資料合併,進而建立來源資料表的最終資料表。在「合併」模式下,系統不會保留變更事件的歷來記錄。舉例來說,如果您先插入資料列再更新資料列,BigQuery 只會保留更新後的資料。接著,如果您從來源表格中刪除資料列,BigQuery 就不會再保留該資料列的任何記錄。
  • 只附加:只附加寫入模式可讓您將資料新增至 BigQuery,做為變更串流 (INSERTUPDATE-INSERTUPDATE-DELETEDELETE 事件)。如需保留資料的歷史狀態,請使用此模式。如要進一步瞭解僅附加寫入模式,請考慮下列情境:
    • 初始補充作業:在初始補充作業完成後,所有事件都會以 INSERT 類型事件寫入 BigQuery,並附上相同的時間戳記、通用唯一識別碼 (UUID) 和變更序號。
    • 主鍵更新:當主鍵變更時,系統會將兩個資料列寫入 BigQuery:
      • 含有原始主鍵的 UPDATE-DELETE 資料列
      • 含有新主鍵的 UPDATE-INSERT 資料列
    • 資料列更新:更新資料列時,系統會將單一 UPDATE-INSERT 資料列寫入 BigQuery
    • 資料列刪除:刪除資料列時,系統會將單一 DELETE 資料列寫入 BigQuery

資料表中繼資料

Datastream 會在寫入 BigQuery 目的地的每個資料表中附加名為 datastream_metadataSTRUCT 資料欄。

合併寫入模式

如果資料表在來源中具有主鍵,則該欄會包含下列欄位:

  • UUID:這個欄位具有 STRING 資料類型。
  • SOURCE_TIMESTAMP:這個欄位具有 INTEGER 資料類型。

如果資料表沒有主鍵,則資料欄會包含額外的欄位:IS_DELETED。這個欄位具有 BOOLEAN 資料類型,可指出 Datastream 傳送至目的地的資料是否與來源的 DELETE 作業相關聯。沒有主鍵的資料表只能追加資料。

僅附加寫入模式

datastream_metadata 欄位包含有/無主鍵的資料表相同欄位:

  • UUID:這個欄位具有 STRING 資料類型。
  • SOURCE_TIMESTAMP:這個欄位具有 INTEGER 資料類型。
  • CHANGE_SEQUENCE_NUMBER:這個欄位具有 STRING 資料類型。這是 Datastream 為每個變更事件使用的內部序號。
  • CHANGE_TYPE:這個欄位具有 STRING 資料類型。這項屬性會指出變更事件的類型:INSERTUPDATE-INSERTUPDATE-DELETEDELETE
  • SORT_KEYS:這個欄位包含 STRING 值的陣列。您可以使用這些值來排序變更事件。

使用 max_staleness 選項搭配 BigQuery 資料表

為了近乎即時擷取資料,Datastream 會使用 BigQuery 內建的更新/插入/刪除資料等上傳/插入/刪除作業支援功能。透過 Upsert 作業,您可以在新增、修改或刪除資料列時,動態更新 BigQuery 目的地。Datastream 會使用 BigQuery Storage Write API,將這些更新/插入作業串流至目的地資料表。

指定資料過時程度限制

BigQuery 會根據設定的資料過時程度限制,以持續的方式或於查詢執行時,在背景中套用來源修改內容。當 Datastream 在 BigQuery 中建立新資料表時,系統會根據資料流目前的資料過時程度限制值設定資料表的 max_staleness 選項。

如要進一步瞭解如何搭配使用 BigQuery 資料表和 max_staleness 選項,請參閱「資料表失效」。

控管 BigQuery 費用

BigQuery 費用會與 Datastream 費用分開計費。如要瞭解如何控管 BigQuery 費用,請參閱 BigQuery CDC 定價

地圖資料類型

下表列出從支援的來源資料庫轉換至 BigQuery 目的地的資料類型轉換。


來源資料庫 來源資料類型 BigQuery 資料類型
MySQL BIGINT(size) LONG
MySQL BIGINT (unsigned) DECIMAL
MySQL BINARY(size) STRING (hex encoded)
MySQL BIT(size) INT64
MySQL BLOB(size) STRING (hex encoded)
MySQL BOOL INT64
MySQL CHAR(size) STRING
MySQL DATE DATE
MySQL DATETIME(fsp) DATETIME
MySQL DECIMAL(precision, scale) 如果精確度值 <=38,且小數位數值 <=9,則為 NUMERIC。否則 BIGNUMERIC
MySQL DOUBLE(size, d) FLOAT64
MySQL ENUM(val1, val2, val3, ...) STRING
MySQL FLOAT(precision) FLOAT64
MySQL FLOAT(size, d) FLOAT64
MySQL INTEGER(size) INT64
MySQL INTEGER (unsigned) LONG
MySQL

JSON

JSON 支援
MySQL LONGBLOB STRING (hex encoded)
MySQL LONGTEXT STRING
MySQL MEDIUMBLOB STRING (hex encoded)
MySQL MEDIUMINT(size) INT64
MySQL MEDIUMTEXT STRING
MySQL SET(val1, val2, val3, ...) STRING
MySQL SMALLINT(size) INT64
MySQL TEXT(size) STRING
MySQL TIME(fsp) INTERVAL
MySQL TIMESTAMP(fsp) TIMESTAMP
MySQL TINYBLOB STRING (hex encoded)
MySQL TINYINT(size) INT64
MySQL TINYTEXT STRING
MySQL VARBINARY(size) STRING (hex encoded)
MySQL VARCHAR STRING
MySQL YEAR INT64
Oracle ANYDATA UNSUPPORTED
Oracle BFILE STRING
Oracle BINARY DOUBLE FLOAT64
Oracle BINARY FLOAT FLOAT64
Oracle BLOB BYTES
Oracle CHAR STRING
Oracle CLOB STRING
Oracle DATE DATETIME
Oracle DOUBLE PRECISION FLOAT64
Oracle FLOAT(p) FLOAT64
Oracle INTERVAL DAY TO SECOND UNSUPPORTED
Oracle INTERVAL YEAR TO MONTH UNSUPPORTED
Oracle LONG/LONG RAW STRING
Oracle NCHAR STRING
Oracle NCLOB STRING
Oracle NUMBER STRING
Oracle NUMBER(precision=*) STRING
Oracle NUMBER(precision, scale<=0) 如果 p<=18,則為 INT64。如果 18<p=<78,則對應至參數化小數類型。如果 p>=79,請對應至 STRING
Oracle NUMBER(precision, scale>0) 如果 0<p=<78,則對應至參數化小數類型。如果 p>=79,則對應至 STRING
Oracle NVARCHAR2 STRING
Oracle RAW STRING
Oracle ROWID STRING
Oracle SDO_GEOMETRY UNSUPPORTED
Oracle SMALLINT INT64
Oracle TIMESTAMP TIMESTAMP
Oracle TIMESTAMP WITH TIME ZONE TIMESTAMP
Oracle UDT (user-defined type) UNSUPPORTED
Oracle UROWID STRING
Oracle VARCHAR STRING
Oracle VARCHAR2 STRING
Oracle XMLTYPE UNSUPPORTED
PostgreSQL ARRAY JSON
PostgreSQL BIGINT INT64
PostgreSQL BIT BYTES
PostgreSQL BIT_VARYING BYTES
PostgreSQL BOOLEAN BOOLEAN
PostgreSQL BOX UNSUPPORTED
PostgreSQL BYTEA BYTES
PostgreSQL CHARACTER STRING
PostgreSQL CHARACTER_VARYING STRING
PostgreSQL CIDR STRING
PostgreSQL CIRCLE UNSUPPORTED
PostgreSQL DATE DATE
PostgreSQL DOUBLE_PRECISION FLOAT64
PostgreSQL ENUM STRING
PostgreSQL INET STRING
PostgreSQL INTEGER INT64
PostgreSQL INTERVAL INTERVAL
PostgreSQL JSON JSON
PostgreSQL JSONB JSON
PostgreSQL LINE UNSUPPORTED
PostgreSQL LSEG UNSUPPORTED
PostgreSQL MACADDR STRING
PostgreSQL MONEY FLOAT64
PostgreSQL NUMERIC 如果精確度 = -1,則為 STRING (BigQuery NUMERIC 類型需要固定精確度)。否則為 BIGNUMERIC/NUMERIC。詳情請參閱 PostgreSQL 說明文件中的「任意精確度數字」一節。
PostgreSQL OID INT64
PostgreSQL PATH UNSUPPORTED
PostgreSQL POINT UNSUPPORTED
PostgreSQL POLYGON UNSUPPORTED
PostgreSQL REAL FLOAT64
PostgreSQL SMALLINT INT64
PostgreSQL SMALLSERIAL INT64
PostgreSQL SERIAL INT64
PostgreSQL TEXT STRING
PostgreSQL TIME TIME
PostgreSQL TIMESTAMP TIMESTAMP
PostgreSQL TIMESTAMP_WITH_TIMEZONE TIMESTAMP
PostgreSQL TIME_WITH_TIMEZONE TIME
PostgreSQL TSQUERY STRING
PostgreSQL TSVECTOR STRING
PostgreSQL TXID_SNAPSHOT STRING
PostgreSQL UUID STRING
PostgreSQL XML STRING
SQL Server BIGINT INT64
SQL Server BINARY BYTES
SQL Server BIT BOOL
SQL Server CHAR STRING
SQL Server DATE DATE
SQL Server DATETIME2 DATETIME
SQL Server DATETIME DATETIME
SQL Server DATETIMEOFFSET TIMESTAMP
SQL Server DECIMAL BIGNUMERIC
SQL Server FLOAT FLOAT64
SQL Server IMAGE BYTES
SQL Server INT INT64
SQL Server MONEY BIGNUMERIC
SQL Server NCHAR STRING
SQL Server NTEXT STRING
SQL Server NUMERIC BIGNUMERIC
SQL Server NVARCHAR STRING
SQL Server NVARCHAR(MAX) STRING
SQL Server REAL FLOAT64
SQL Server SMALLDATETIME DATETIME
SQL Server SMALLINT INT64
SQL Server SMALLMONEY NUMERIC
SQL Server TEXT STRING
SQL Server TIME TIME
SQL Server TIMESTAMP/ROWVERSION BYTES
SQL Server TINYINT INT64
SQL Server UNIQUEIDENTIFIER STRING
SQL Server VARBINARY BYTES
SQL Server VARBINARY(MAX) BYTES
SQL Server VARCHAR STRING
SQL Server VARCHAR(MAX) STRING
SQL Server XML STRING
Salesforce BOOLEAN BOOLEAN
Salesforce BYTE BYTES
Salesforce DATE DATE
Salesforce DATETIME DATETIME
Salesforce DOUBLE BIGNUMERIC
Salesforce INT INT64
Salesforce STRING STRING
Salesforce TIME TIME
Salesforce ANYTYPE (可以是 STRINGDATENUMBERBOOLEAN) STRING
Salesforce COMBOBOX STRING
Salesforce CURRENCY FLOAT64

長度上限為 18 個數字。

Salesforce DATACATEGORYGROUPREFERENCE STRING
Salesforce EMAIL STRING
Salesforce ENCRYPTEDSTRING STRING
Salesforce ID STRING
Salesforce JUNCTIONIDLIST STRING
Salesforce MASTERRECORD STRING
Salesforce MULTIPICKLIST STRING
Salesforce PERCENT FLOAT64

長度上限為 18 個數字。

Salesforce PHONE STRING
Salesforce PICKLIST STRING
Salesforce REFERENCE STRING
Salesforce TEXTAREA STRING

長度上限為 255 個半形字元。

Salesforce URL STRING

MongoDB 資料類型

MongoDB 二進位 JSON (BSON) 文件會以 MongoDB Extended JSON (v1) 嚴格模式格式寫入 BigQuery。下表說明 BigQuery 如何表示資料類型,並列出示例值。

來源資料類型範例值BigQuery JSON 類型值
DOUBLE 3.1415926535 3.1415926535
STRING"Hello, MongoDB!""Hello, MongoDB!"
ARRAY
[
    "item1",
    123,
    true,
    { subItem: "object in array" }
  ]
    
["item1",123,true,{"subItem":"object in array"}]
BINARY DATA new BinData(0, "SGVsbG8gQmluYXJ5IERhdGE=") {"$binary":"SGVsbG8gQmluYXJ5IERhdGE=","$type":"00"}
BOOLEANtruetrue
DATE 2024-12-25T10:30:00.000+00:00 {"$date": 1735122600000}
NULLnullnull
REGEX/^mongo(db)?$/i{"$options":"i","$regex":"^mongo(db)?$"}
JAVASCRIPTfunction() {return this.stringField.length;}{"$code":"function() {\n return this.stringField.length;\n }"}
DECIMAL128NumberDecimal("1234567890.1234567890"){"$numberDecimal":"1234567890.1234567890"}
OBJECTIDObjectId('673c5d8dbfe2e51808cc2c3d'){"$oid": "673c5d8dbfe2e51808cc2c3d"}
LONG3567587327{"$numberLong": "3567587327"}
INT324242
INT641864712049423024127{"$numberLong": "1864712049423024127"}
TIMESTAMPnew Timestamp(1747888877, 1){"$timestamp":{"i":1,"t":1747888877}}

以 BigQuery 陣列資料類型查詢 PostgreSQL 陣列

如果您想以 BigQuery ARRAY 資料類型查詢 PostgreSQL 陣列,可以使用 BigQuery JSON_VALUE_ARRAY 函式將 JSON 值轉換為 BigQuery 陣列:

  SELECT ARRAY(SELECT CAST(element AS TYPE) FROM UNNEST(JSON_VALUE_ARRAY(BQ_COLUMN_NAME,'$')) AS element) AS array_col
  

更改下列內容:

  • TYPE:與 PostgreSQL 來源陣列中的元素類型相符的 BigQuery 類型。舉例來說,如果來源類型是 BIGINT 值的陣列,請將 TYPE 替換為 INT64

    如要進一步瞭解如何對應資料類型,請參閱「對應資料類型」。

  • BQ_COLUMN_NAME:BigQuery 資料表中相關資料欄的名稱。

但有 2 種例外情況:

  • 如果來源欄中的 BITBIT_VARYINGBYTEA 值是陣列,請執行以下查詢:

    SELECT ARRAY(SELECT FROM_BASE64(element) FROM UNNEST(JSON_VALUE_ARRAY(BQ_COLUMN_NAME,'$')) AS element) AS array_of_bytes
  • 如果來源資料欄包含 JSONJSONB 值的陣列,請使用 JSON_QUERY_ARRAY 函式:

    SELECT ARRAY(SELECT element FROM UNNEST(JSON_QUERY_ARRAY(BQ_COLUMN_NAME,'$')) AS element) AS array_of_jsons

已知限制

使用 BigQuery 做為目的地的已知限制包括:

  • 您只能將資料複製到與 Datastream 串流位於相同 Google Cloud 專案中的 BigQuery 資料集。
  • 根據預設,Datastream 不支援在已複製至 BigQuery 的資料表中新增主鍵,或從已複製至 BigQuery 的資料表中移除主鍵。如需變更,請與 Google 支援團隊聯絡。如要瞭解如何變更已含有主鍵的來源資料表的主鍵定義,請參閱「診斷問題」一文。
  • BigQuery 中的主鍵必須為下列資料類型:

    • DATE
    • BOOL
    • GEOGRAPHY
    • INT64
    • NUMERIC
    • BIGNUMERIC
    • STRING
    • TIMESTAMP
    • DATETIME

    資料表如果含有不支援資料類型的主鍵,Datastream 就不會複製該資料表。

  • BigQuery 不支援含有 .$/@+ 字元的資料表名稱。建立目的地資料表時,Datastream 會將這些字元替換為底線。

    舉例來說,來源資料庫中的 table.name 會變成 BigQuery 中的 table_name

    如要進一步瞭解 BigQuery 中的資料表名稱,請參閱「資料表命名」一文。

  • BigQuery 不支援超過四個的叢集資料欄。複製具有四個以上主鍵欄的資料表時,Datastream 會使用四個主鍵欄做為叢集欄。
  • Datastream 會將超出範圍的日期和時間文字常值 (例如 PostgreSQL 無限日期類型) 對應至下列值:
    • DATE9999-12-31 的值
    • 將負值 DATE 設為 0001-01-01 的值
    • TIMESTAMP9999-12-31 23:59:59.999000 UTC 的值
    • 將負值 TIMESTAMP 設為 0001-01-01 00:00:00 UTC 的值
  • BigQuery 不支援主鍵為 FLOATREAL 資料類型的串流資料表。這類資料表不會複製。
  • 如果來源是 Salesforce,系統不支援「Dataset for each schema」設定選項。
  • 如要進一步瞭解 BigQuery 日期類型和範圍,請參閱「資料類型」。

將這個值設為 0 雖然可確保最新性,但成本不容忽視。

後續步驟