本頁說明如何設定 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,做為變更串流 (
INSERT
、UPDATE-INSERT
、UPDATE-DELETE
和DELETE
事件)。如需保留資料的歷史狀態,請使用此模式。如要進一步瞭解僅附加寫入模式,請考慮下列情境:- 初始補充作業:在初始補充作業完成後,所有事件都會以
INSERT
類型事件寫入 BigQuery,並附上相同的時間戳記、通用唯一識別碼 (UUID) 和變更序號。 - 主鍵更新:當主鍵變更時,系統會將兩個資料列寫入 BigQuery:
- 含有原始主鍵的
UPDATE-DELETE
資料列 - 含有新主鍵的
UPDATE-INSERT
資料列
- 含有原始主鍵的
- 資料列更新:更新資料列時,系統會將單一
UPDATE-INSERT
資料列寫入 BigQuery - 資料列刪除:刪除資料列時,系統會將單一
DELETE
資料列寫入 BigQuery
- 初始補充作業:在初始補充作業完成後,所有事件都會以
資料表中繼資料
Datastream 會在寫入 BigQuery 目的地的每個資料表中附加名為 datastream_metadata
的 STRUCT
資料欄。
合併寫入模式
如果資料表在來源中具有主鍵,則該欄會包含下列欄位:
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
資料類型。這項屬性會指出變更事件的類型:INSERT
、UPDATE-INSERT
、UPDATE-DELETE
或DELETE
。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
支援 |
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(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 (可以是 STRING 、DATE 、NUMBER 或 BOOLEAN ) |
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"}] |
BINARY DATA |
new BinData(0, "SGVsbG8gQmluYXJ5IERhdGE=") |
{"$binary":"SGVsbG8gQmluYXJ5IERhdGE=","$type":"00"} |
BOOLEAN | true | true |
DATE |
2024-12-25T10:30:00.000+00:00
|
{"$date": 1735122600000}
|
NULL | null | null |
REGEX | /^mongo(db)?$/i | {"$options":"i","$regex":"^mongo(db)?$"} |
JAVASCRIPT | function() {return this.stringField.length;} | {"$code":"function() {\n return this.stringField.length;\n }"} |
DECIMAL128 | NumberDecimal("1234567890.1234567890") | {"$numberDecimal":"1234567890.1234567890"} |
OBJECTID | ObjectId('673c5d8dbfe2e51808cc2c3d') | {"$oid": "673c5d8dbfe2e51808cc2c3d"} |
LONG | 3567587327 | {"$numberLong": "3567587327"} |
INT32 | 42 | 42 |
INT64 | 1864712049423024127 | {"$numberLong": "1864712049423024127"} |
TIMESTAMP | new 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 種例外情況:
如果來源欄中的
BIT
、BIT_VARYING
或BYTEA
值是陣列,請執行以下查詢:SELECT ARRAY(SELECT FROM_BASE64(element) FROM UNNEST(JSON_VALUE_ARRAY(BQ_COLUMN_NAME,'$')) AS element)
AS array_of_bytes 如果來源資料欄包含
JSON
或JSONB
值的陣列,請使用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 無限日期類型) 對應至下列值:
- 正
DATE
到9999-12-31
的值 - 將負值
DATE
設為0001-01-01
的值 - 正
TIMESTAMP
到9999-12-31 23:59:59.999000 UTC
的值 - 將負值
TIMESTAMP
設為0001-01-01 00:00:00 UTC
的值
- 正
- BigQuery 不支援主鍵為
FLOAT
或REAL
資料類型的串流資料表。這類資料表不會複製。 - 如果來源是 Salesforce,系統不支援「Dataset for each schema」設定選項。
如要進一步瞭解 BigQuery 日期類型和範圍,請參閱「資料類型」。
將這個值設為 0
雖然可確保最新性,但成本不容忽視。