בדף הזה מוסבר איך Datastream ממפה סוגי נתונים ממסדי נתונים שונים של מקור לסוגי הנתונים התואמים ב-BigQuery. במאמר הזה מוסבר איך סוגי נתונים שונים מומרים כשמעבירים נתונים ל-BigQuery, איך BigQuery מייצג מסמכי JSON בינארי (BSON) של MongoDB ואיך שולחים שאילתות לנתוני מערך של PostgreSQL כסוג נתונים ARRAY ב-BigQuery.
מיפוי סוגי נתונים
בטבלה הבאה מפורטים המרות של סוגי נתונים ממסדי נתונים נתמכים של מקורות אל היעד ב-BigQuery.
| מסד נתונים של המקור | סוג נתוני המקור | סוג נתונים ב-BigQuery |
|---|---|---|
| MySQL | BIGINT(size) |
INT64 |
| 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) |
INT64 |
| 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 |
UNSUPPORTED |
| 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 |
UNSUPPORTED |
| Oracle | NCHAR |
STRING |
| Oracle | NCLOB |
STRING |
| Oracle | NUMBER(precision, scale>0) |
אם 0 < precision ≤ 78, המיפוי הוא לסוגים עשרוניים עם פרמטרים. אם רמת הדיוק היא ≥ 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 |
UNSUPPORTED |
| 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 |
אם precision = -1, אז STRING
(סוגי NUMERIC ב-BigQuery דורשים דיוק קבוע). אחרת, 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 TIME ZONE |
TIMESTAMP |
| PostgreSQL | TIME WITH TIME ZONE |
TIME |
| PostgreSQL | TSQUERY |
STRING |
| PostgreSQL | TSVECTOR |
STRING |
| PostgreSQL | TXID SNAPSHOT |
STRING |
| PostgreSQL | UUID |
STRING |
| PostgreSQL | XML |
STRING |
| שרת SQL | BIGINT |
INT64 |
| שרת SQL | BINARY |
BYTES |
| שרת SQL | BIT |
BOOL |
| שרת SQL | CHAR |
STRING |
| שרת SQL | DATE |
DATE |
| שרת SQL | DATETIME2 |
DATETIME |
| שרת SQL | DATETIME |
DATETIME |
| שרת SQL | DATETIMEOFFSET |
TIMESTAMP |
| שרת SQL | DECIMAL |
אם ערך הסקאלה הוא ≤ 9 והערך של (precision - scale) הוא ≤ 29, אז NUMERIC. אחרת,
BIGNUMERIC. |
| שרת SQL | FLOAT |
FLOAT64 |
| שרת SQL | IMAGE |
BYTES |
| שרת SQL | INT |
INT64 |
| שרת SQL | MONEY |
NUMERIC |
| שרת SQL | NCHAR |
STRING |
| שרת SQL | NTEXT |
STRING |
| שרת SQL | NUMERIC |
אם ערך הסקאלה הוא ≤ 9 והערך של (precision - scale) הוא ≤ 29, אז NUMERIC. אחרת,
BIGNUMERIC. |
| שרת SQL | NVARCHAR |
STRING |
| שרת SQL | NVARCHAR(MAX) |
STRING |
| שרת SQL | REAL |
FLOAT64 |
| שרת SQL | SMALLDATETIME |
DATETIME |
| שרת SQL | SMALLINT |
INT64 |
| שרת SQL | SMALLMONEY |
NUMERIC |
| שרת SQL | TEXT |
STRING |
| שרת SQL | TIME |
TIME |
| שרת SQL | TIMESTAMP או ROWVERSION |
BYTES |
| שרת SQL | TINYINT |
INT64 |
| שרת SQL | UNIQUEIDENTIFIER |
STRING |
| שרת SQL | VARBINARY |
BYTES |
| שרת SQL | VARBINARY(MAX) |
BYTES |
| שרת SQL | VARCHAR |
STRING |
| שרת SQL | VARCHAR(MAX) |
STRING |
| שרת SQL | 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 |
| Spanner (GoogleSQL) | ARRAY |
JSON |
| Spanner (GoogleSQL) | BOOL |
BOOLEAN |
| Spanner (GoogleSQL) | BYTES |
BYTES |
| Spanner (GoogleSQL) | DATE |
DATE |
| Spanner (GoogleSQL) | FLOAT32 |
FLOAT64 |
| Spanner (GoogleSQL) | FLOAT64 |
FLOAT64 |
| Spanner (GoogleSQL) | INT64 |
INT64 |
| Spanner (GoogleSQL) | JSON |
JSON |
| Spanner (GoogleSQL) | NUMERIC |
STRING |
| Spanner (GoogleSQL) | STRING |
STRING |
| Spanner (GoogleSQL) | TIMESTAMP |
TIMESTAMP WITH TIME ZONE |
| Spanner (GoogleSQL) | UUID |
STRING |
| Spanner (GoogleSQL) | PROTO |
UNSUPPORTED |
| Spanner (GoogleSQL) | ENUM |
UNSUPPORTED |
| Spanner (PostgreSQL) | ARRAY |
JSON |
| Spanner (PostgreSQL) | BIGINT |
INT64 |
| Spanner (PostgreSQL) | BOOL |
BOOLEAN |
| Spanner (PostgreSQL) | BYTEA |
BYTES |
| Spanner (PostgreSQL) | DATE |
DATE |
| Spanner (PostgreSQL) | DECIMAL |
STRING |
| Spanner (PostgreSQL) | DOUBLE PRECISION |
FLOAT64 |
| Spanner (PostgreSQL) | FLOAT8 |
FLOAT64 |
| Spanner (PostgreSQL) | INT8 |
INT64 |
| Spanner (PostgreSQL) | JSONB |
JSON |
| Spanner (PostgreSQL) | NUMERIC |
STRING |
| Spanner (PostgreSQL) | TIMESTAMP WITH TIME ZONE |
TIMESTAMP WITH TIME ZONE |
| Spanner (PostgreSQL) | TIMESTAMPZ |
TIMESTAMP WITH TIME ZONE |
| Spanner (PostgreSQL) | UUID |
STRING |
| Spanner (PostgreSQL) | VARCHAR |
STRING |
סוגי נתונים ב-MongoDB
מסמכי MongoDB בינאריים בפורמט JSON (BSON) נכתבים ל-BigQuery באחד משני מצבים, בהתאם למה שמציינים במהלך יצירת השידור (ראו ניהול שידורים): מצב קנוני (ברירת מחדל) או מצב מחמיר.
- מצב קנוני (ברירת מחדל): הפורמט המודרני והתיאורי יותר שנותן עדיפות לדיוק הנתונים. היא מוודאת שכל סוג BSON מסומן באופן מפורש, למשל, שהיא מבחינה בין מספר שלם של 32 ביט לבין מספר שלם של 64 ביט, כדי למנוע אובדן של דיוק במהלך חילופי נתונים. יכול להיות שהמצב הקנוני איטי יותר מהמצב המחמיר, אבל הוא תומך בכל סוגי הנתונים. מידע נוסף זמין במאמר בנושא MongoDB Extended JSON.
- מצב קפדני: פורמט מדור קודם שנועד להיות תואם למנתחי JSON, באמצעות מוסכמות ספציפיות, כמו
"$date", כדי לייצג סוגים שלא קיימים ב-JSON רגיל. סוגי נתונים מסוימים, כמוInfinity,-Infinityו-NaN, לא נתמכים. מידע נוסף זמין במאמר MongoDB Extended JSON (v1).
בטבלה הבאה מוצגות דרכי הייצוג של סוגי הנתונים ב-BigQuery בשני המצבים, יחד עם ערכים לדוגמה:
| סוג הנתונים BSON | ערך לדוגמה | מצב קנוני | מצב קפדני |
|---|---|---|---|
DOUBLE |
3.1415926535 |
{"$numberDouble":"3.1415926535"} |
3.1415926535 |
Infinity |
Infinity |
{"$numberDouble":"Infinity"} |
לא נתמך |
-Infinity |
-Infinity |
{"$numberDouble":"-Infinity"} |
לא נתמך |
NaN |
NaN |
{"$numberDouble":"NaN"} |
לא נתמך |
STRING |
"Hello, MongoDB!" |
"Hello, MongoDB!" |
"Hello, MongoDB!" |
ARRAY |
|
["item1",{"$numberInt":"123"},true,{"subItem":"object in array"}]
|
["item1",123,true,{"subItem":"object in array"}] |
BINARY DATA |
new BinData(0, "SGVsbG8gQmluYXJ5IERhdGE=") |
{"$binary":{"base64":"SGVsbG8gQmluYXJ5IERhdGE=","subType":"00"}}
|
{"$binary":"SGVsbG8gQmluYXJ5IERhdGE=","$type":"00"} |
BOOLEAN |
true |
true |
true |
DATE |
2024-12-25T10:30:00.000+00:00 |
{"$date":{"$numberLong":"1735122600000"}} |
{"$date": 1735122600000} |
NULL |
null |
null |
null |
REGEX |
/^mongo(db)?$/i |
{"$regularExpression":{"pattern":"^mongo(db)?$","options":"i"}}
|
{"$options":"i","$regex":"^mongo(db)?$"} |
JAVASCRIPT |
function() {return this.stringField.length;} |
{"$code":"function() {\n return this.stringField.length;\n }"}
|
{"$code":"function() {\n return this.stringField.length;\n }"}
|
DECIMAL128 |
NumberDecimal("1234567890.1234567890") |
{"$numberDecimal":"1234567890.1234567890"} |
{"$numberDecimal":"1234567890.1234567890"} |
OBJECTID |
ObjectId('673c5d8dbfe2e51808cc2c3d') |
{"$oid": "673c5d8dbfe2e51808cc2c3d"} |
{"$oid": "673c5d8dbfe2e51808cc2c3d"} |
LONG |
3567587327 |
{"$numberLong": "3567587327"} |
{"$numberLong": "3567587327"} |
INT32 |
42 |
{"$numberInt": "42"} |
42 |
INT64 |
1864712049423024127 |
{"$numberLong": "1864712049423024127"} |
{"$numberLong": "1864712049423024127"} |
TIMESTAMP |
new Timestamp(1747888877, 1) |
{"$timestamp":{"t":1747888877,"i":1}} |
{"$timestamp":{"i":1,"t":1747888877}} |
הרצת שאילתות במערך PostgreSQL כמערך מסוג נתונים של BigQuery
כדי להריץ שאילתה על מערך PostgreSQL כסוג נתונים של ARRAY BigQuery, צריך להמיר את הערכים של JSON למערך BigQuery באמצעות הפונקציה JSON_VALUE_ARRAY של BigQuery:
SELECT ARRAY( SELECT CAST(element AS TYPE) FROM UNNEST(JSON_VALUE_ARRAY(BQ_COLUMN_NAME, '$')) AS element ) AS array_col
מחליפים את מה שכתוב בשדות הבאים:
- TYPE: הסוג ב-BigQuery שתואם לסוג הרכיב במערך המקור של PostgreSQL. לדוגמה, אם סוג המקור הוא מערך של ערכי
BIGINT, מחליפים את TYPE ב-INT64. מידע נוסף על מיפוי סוגי הנתונים זמין במאמר בנושא מיפוי סוגי נתונים. - BQ_COLUMN_NAME: שם העמודה הרלוונטית בטבלה ב-BigQuery.
יש שני חריגים לדרך שבה ממירים את הערכים:
כדי להציג מערכים של ערכים
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