Snowflake SQL 翻譯指南
本文詳述 Snowflake 和 BigQuery 之間 SQL 語法的相似與差異之處,協助加速將企業資料倉儲 (EDW) 移至 BigQuery 的規劃與執行作業。Snowflake 資料倉儲技術專為與 Snowflake 專屬的 SQL 語法搭配使用而設計。由於 SQL 方言會因為服務不同而有差異,針對 Snowflake 撰寫的指令碼必須先進行修改才可在 BigQuery 中使用。您可以使用批次 SQL 翻譯大量遷移 SQL 指令碼,或是使用互動式 SQL 翻譯翻譯臨時查詢。兩個工具在預先發布版中都支援 Snowflake SQL。
資料類型
本節說明 Snowflake 和 BigQuery 的資料類型之間的對應關係。
Snowflake | BigQuery | 附註 |
---|---|---|
NUMBER/
DECIMAL/NUMERIC |
NUMERIC/BIGNUMERIC |
視精確度和比例而定,可對應至 NUMERIC 或 BIGNUMERIC 。Snowflake 中的 NUMBER 資料類型支援 38 位精確度和 37 位小數位數。您可以根據使用者指定精確度和比例。BigQuery 支援 NUMERIC 和 BIGNUMERIC ,可在特定範圍內指定精確度和比例。 |
INT/INTEGER |
BIGNUMERIC |
INT/INTEGER 和所有其他類似 INT 的資料類型 (例如 BIGINT, TINYINT, SMALLINT, BYTEINT ) 代表 NUMBER 資料類型的別名,其中精確度和比例無法指定,且一律為 NUMBER(38, 0) |
BIGINT |
BIGNUMERIC |
|
SMALLINT |
BIGNUMERIC |
|
TINYINT |
BIGNUMERIC |
|
BYTEINT |
BIGNUMERIC |
|
FLOAT/ |
FLOAT64 |
Snowflake 中的 FLOAT 資料類型會將「NaN」設為 > X,其中 X 是任何 FLOAT 值 (除了「NaN」本身)。BigQuery 中的 FLOAT 資料類型會將「NaN」設為 < X,其中 X 是任何 FLOAT 值 (除了「NaN」本身)。 |
DOUBLE/ REAL |
FLOAT64 |
Snowflake 中的 DOUBLE 資料類型與 Snowflake 中的 FLOAT 資料類型同義,但通常會誤顯示為 FLOAT 。並以 DOUBLE 格式正確儲存。 |
VARCHAR |
STRING |
Snowflake 中的 VARCHAR 資料類型大小上限為 16 MB (未壓縮)。如果未指定長度,預設值為最大長度。BigQuery 中的 STRING 資料類型會儲存為可變長度 UTF-8 編碼的 Unicode。長度上限為 16,000 個半形字元。 |
CHAR/CHARACTER |
STRING |
Snowflake 中的 CHAR 資料類型長度上限為 1。 |
STRING/TEXT |
STRING |
Snowflake 中的 STRING 資料類型與 Snowflake 的 VARCHAR 相同。 |
BINARY |
BYTES |
|
VARBINARY |
BYTES |
|
BOOLEAN |
BOOL |
BigQuery 中的 BOOL 資料類型只能接受 TRUE/FALSE ,而 Snowflake 中的 BOOL 資料類型則可接受 TRUE/FALSE/NULL。 |
DATE |
DATE |
Snowflake 中的 DATE 類型可接受多數常見日期格式,這與 BigQuery 中的 DATE 類型不同,後者只接受格式為「YYYY-[M]M-[D]D」的日期。 |
TIME |
TIME |
Snowflake 中的 TIME 類型支援 0 到 9 奈秒的精確度,而 BigQuery 中的 TIME 類型則支援 0 到 6 奈秒的精確度。 |
TIMESTAMP |
DATETIME |
TIMESTAMP 是使用者可設定的別名,預設值為 TIMESTAMP_NTZ ,會對應至 BigQuery 中的 DATETIME 。 |
TIMESTAMP_LTZ |
TIMESTAMP |
|
TIMESTAMP_NTZ/DATETIME |
DATETIME |
|
TIMESTAMP_TZ |
TIMESTAMP |
|
OBJECT |
JSON |
Snowflake 中的 OBJECT 類型不支援明確指定類型的值。值為 VARIANT 類型。 |
VARIANT |
JSON |
Snowflake 中的 OBJECT 類型不支援明確指定類型的值。值為 VARIANT 類型。 |
ARRAY |
ARRAY<JSON> |
Snowflake 中的 ARRAY 類型只能支援 VARIANT 類型,而 BigQuery 中的 ARRAY 類型則可支援所有資料類型 (陣列本身除外)。 |
BigQuery 也提供下列沒有直接 Snowflake 對應項目的資料類型:
查詢語法和查詢運算子
本節將說明 Snowflake 和 BigQuery 之間的查詢語法差異。
SELECT
陳述式
大多數 Snowflake SELECT
陳述式都與 BigQuery 相容。下表列出兩者之間的細微差異。
Snowflake | BigQuery | |
---|---|---|
|
|
|
注意:Snowflake 支援在同一個 SELECT 陳述式中建立及參照別名。 |
|
|
|
|
根據預設,Snowflake 別名和 ID 不區分大小寫。為保留大小寫,請使用雙引號 (「」) 將別名和 ID 括起來。
FROM
子句
查詢中的 FROM
子句會指定在 SELECT 陳述式中使用的可能資料表、檢視畫面、子查詢或資料表函式。BigQuery 支援所有這些資料表參照。
下表列出一些細微差異。
Snowflake | BigQuery | |
---|---|---|
|
WITH table1 AS |
|
|
|
|
|
注意:BigQuery 沒有直接的替代方案,無法在使用陳述式 ID 之前使用 Snowflake 的替代方案。timestamp 的值不得早於目前時間戳記的 7 天前。 |
|
|
BigQuery 不支援階段檔案的概念。 |
|
|
BigQuery 並未提供 Snowflake |
您可以在 FROM
子句中使用以下方式參照 BigQuery 資料表:
[project_id].[dataset_id].[table_name]
[dataset_id].[table_name]
[table_name]
BigQuery 也支援其他資料表參照:
- 使用
FOR SYSTEM_TIME AS OF
的資料表定義和資料列歷史版本 - 欄位路徑,或任何可解析為資料類型內欄位的路徑 (也就是
STRUCT
) - 已展開的陣列
WHERE
子句
Snowflake WHERE
子句和 BigQuery WHERE
子句的差異如下:
Snowflake | BigQuery | |
---|---|---|
|
SELECT col1, col2 注意:BigQuery 不支援 JOIN 的 (+) 語法 |
JOIN
類型
Snowflake 和 BigQuery 都支援下列聯結類型:
[INNER] JOIN
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
FULL [OUTER] JOIN
CROSS JOIN
和等價的隱含「逗號交叉聯結」
Snowflake 和 BigQuery 都支援 ON
和 USING
子句。
下表列出一些細微差異。
Snowflake | BigQuery | |
---|---|---|
|
注意:在 BigQuery 中, JOIN 子句需要 JOIN 條件,除非是 CROSS JOIN 或其中一個彙整資料表是資料類型或陣列中的欄位。 |
|
注意:與非側向彙整的輸出結果不同,側向彙整的輸出結果只包含從內嵌檢視畫面產生的資料列。左側的資料列不需要與右側彙整,因為左側的資料列已傳入內嵌檢視畫面,因此已納入考量。 |
LATERAL JOIN 的直接替代方案。 |
WITH
子句
BigQuery WITH
子句包含一或多個具名的子查詢,每當後續的 SELECT
陳述式參照這些子查詢時,子查詢即會執行。Snowflake WITH
子句的行為與 BigQuery 相同,但 BigQuery 不支援 WITH RECURSIVE
。
GROUP BY
子句
Snowflake GROUP BY
子句支援 GROUP
BY
、GROUP BY
ROLLUP
、GROUP BY GROUPING
SETS
和 GROUP BY
CUBE
,而 BigQuery GROUP BY
子句支援 GROUP
BY
、GROUP BY
ALL
、GROUP
BY ROLLUP
、GROUP BY GROUPING
SETS
和 GROUP BY
CUBE
。
Snowflake HAVING
和 BigQuery HAVING
是同義詞。請注意,HAVING
會在 GROUP BY
與匯總之後,並在 ORDER BY
之前。
Snowflake | BigQuery | |
---|---|---|
|
|
|
|
|
|
注意:Snowflake 允許在同一個查詢區塊中最多有 128 個分組集 |
|
|
注意:Snowflake 允許每個立方體最多包含 7 個元素 (128 個分組集) |
|
ORDER BY
子句
Snowflake ORDER BY
子句和 BigQuery ORDER BY
子句之間有一些細微差異。
Snowflake | BigQuery | |
---|---|---|
在 Snowflake 中,NULL 預設會排在最後 (遞增順序)。 |
在 BigQuery 中,NULLS 預設會排在第一位 (由小到大排序)。 |
|
您可以分別使用 NULLS FIRST 或 NULLS LAST ,指定 NULL 值應排在前面還是最後面。 |
在 BigQuery 中,沒有等同於 NULL 值的指定值,無法指定 NULL 值應在 BigQuery 中排在前面還是後面。 |
LIMIT/FETCH
子句
Snowflake 中的 LIMIT/FETCH
子句會限制陳述式或子查詢傳回的資料列數量上限。LIMIT
(Postgres 語法) 和 FETCH
(ANSI 語法) 會產生相同的結果。
在 Snowflake 和 BigQuery 中,將 LIMIT
子句套用至查詢不會影響讀取的資料量。
Snowflake | BigQuery | |
---|---|---|
注意:系統會接受 NULL 、空字串 '' 和 $$$$ 值,並視為「無限制」。主要用於連接器和驅動程式。 |
注意:BigQuery 不支援 FETCH 。LIMIT 取代 FETCH 。注意:在 BigQuery 中, OFFSET 必須搭配 LIMIT count 使用。請務必將 count INT64 值設為必要的最低排序資料列,以便取得最佳效能。不必要地排序所有結果列,會導致查詢執行效能變差。 |
QUALIFY
子句
Snowflake 中的 QUALIFY
子句可讓您篩選窗型函式的結果,類似於 HAVING
對匯總函式和 GROUP BY
子句執行的操作。
Snowflake | BigQuery | |
---|---|---|
|
在 BigQuery 中,含有 ROW_NUMBER() 、COUNT() 等分析函式和 OVER PARTITION BY 的 Snowflake QUALIFY 子句會以 WHERE 子句的形式表示,且包含分析值的子查詢。使用 ROW_NUMBER() :SELECT col1, col2
使用支援較大分割區的 ARRAY_AGG() :
|
函式
以下各節列出 Snowflake 函式及其 BigQuery 對應項目。
匯總函式
下表列出常見的 Snowflake 匯總、匯總分析和近似匯總函式,以及其 BigQuery 等同函式之間的對應關係。
Snowflake | BigQuery |
---|---|
注意: DISTINCT 不會產生任何影響 |
|
注意: DISTINCT 不會產生任何影響 |
注意:BigQuery 不支援使用 Window 函式的 APPROX_COUNT_DISTINCT |
注意:Snowflake 沒有 RESPECT NULLS 選項 |
注意:BigQuery 不支援使用 Window 函式的 APPROX_QUANTILES |
|
BigQuery 不支援在預測近似值時儲存中間狀態的功能。 |
|
BigQuery 不支援在預測近似值時儲存中間狀態的功能。 |
|
BigQuery 不支援在預測近似值時儲存中間狀態的功能。 |
注意:如未指定數字參數,預設值為 1。計數器應大於數字。 |
注意:BigQuery 不支援使用 Window 函式的 APPROX_TOP_COUNT 。 |
|
BigQuery 不支援在預測近似值時儲存中間狀態的功能。 |
|
BigQuery 不支援在預測近似值時儲存中間狀態的功能。 |
|
BigQuery 不支援在預測近似值時儲存中間狀態的功能。 |
|
您可以使用自訂 UDF 搭配 k 個不同的雜湊函式,實作 MINHASH 。另一種減少 MINHASH 變異的方法,是將一個雜湊函式的最小值保留為 k 。在這種情況下,Jaccard 指標可近似為下列值:
|
|
:這是 APPROXIMATE_JACCARD_INDEX 的同義詞,可以相同方式實作。 |
|
|
|
注意:BigQuery 的 AVG 不會對 STRING 執行自動轉換。 |
|
INTEGER 。 |
|
注意:BigQuery 不會隱含地將字元/文字欄轉換為最近的 INTEGER 。 |
|
注意:BigQuery 不會隱含地將字元/文字欄轉換為最近的 INTEGER 。 |
注意:如果不是零,Snowflake 會將數字、小數和浮點值視為 TRUE 。 |
|
注意:如果不是零,Snowflake 會將數字、小數和浮點值視為 TRUE 。 |
|
注意:如果不是零,Snowflake 會將數字、小數和浮點值視為 TRUE 。 |
數值運算式:
如要使用 OVER ,您可以執行下列布林值範例:
|
|
|
|
|
|
|
|
|
|
BigQuery 不支援 Snowflake GROUPING 的直接替代方案。可透過使用者定義函式使用。 |
|
BigQuery 不支援 Snowflake GROUPING_ID 的直接替代方案。可透過使用者定義函式使用。 |
|
SELECT BIT_XOR( FARM_FINGERPRINT( TO_JSON_STRING(t))) [OVER] FROM t |
注意:Snowflake 不允許您指定精確度。 |
注意:BigQuery 不支援使用 Window 函式的 HLL_COUNT… 。使用者無法在單一 HLL_COUNT... 函式中加入多個運算式。 |
注意:Snowflake 不允許您指定精確度。 |
HLL_COUNT.INIT (expression [, precision]) |
|
HLL_COUNT.MERGE_PARTIAL (Sketch) |
|
|
|
BigQuery 不支援 Snowflake HLL_EXPORT 的直接替代方案。 |
|
BigQuery 不支援 Snowflake HLL_IMPORT 的直接替代方案。 |
|
BigQuery 不支援 Snowflake KURTOSIS 的直接替代方案。 |
|
|
注意:Snowflake 不支援直接在 ARRAY_AGG. 中 IGNORE|RESPECT NULLS 和 LIMIT |
|
|
|
|
您可以使用自訂 UDF 實作 MINHASH ,並使用 k 不同的雜湊函式。另一種減少 MINHASH 變異的方法,是保留一個雜湊函式的最小值 k : SELECT DISTINCT FARM_FINGERPRINT( TO_JSON_STRING(t)) AS MINHASH
|
|
<code<select FROM ( SELECT DISTINCT FARM_FINGERPRINT( TO_JSON_STRING(t)) AS h FROM TA AS t ORDER BY h LIMIT k UNION SELECT DISTINCT FARM_FINGERPRINT( TO_JSON_STRING(t)) AS h FROM TB AS t ORDER BY h LIMIT k ) ORDER BY h LIMIT k |
|
|
|
建議您使用 TO_JSON_STRING 將值轉換為 JSON 格式字串 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BigQuery 不支援 Snowflake SKEW 的直接替代方案。 |
|
|
|
|
|
|
|
|
注意:Snowflake 支援將 VARCHAR 轉換為浮點值的功能。 |
|
注意:Snowflake 支援將 VARCHAR 轉換為浮點值的功能。 |
|
注意:Snowflake 支援將 VARCHAR 轉換為浮點值的功能。 |
|
注意:Snowflake 支援將 VARCHAR 轉換為浮點值的功能。 |
|
BigQuery 也提供下列匯總、匯總分析和近似匯總函式,這些函式在 Snowflake 中並沒有直接對應的函式:
位元運算式函式
下表列出常見 Snowflake 位元運算式函式與 BigQuery 對應項目之間的對應關係。
如果運算式的資料類型不是 INTEGER
,Snowflake 會嘗試轉換為 INTEGER
。不過,BigQuery 不會嘗試轉換為 INTEGER
。
Snowflake | BigQuery |
---|---|
|
|
|
|
|
|
|
|
BITSHIFTRIGHT
|
|
注意:Snowflake 不支援 DISTINCT. |
|
條件運算式函式
下表列出常見 Snowflake 條件運算式與 BigQuery 對應項目之間的對應關係。
Snowflake | BigQuery |
---|---|
|
|
注意:如果不是零,Snowflake 會將數字、小數和浮點值視為 TRUE 。 |
|
注意:如果不是零,Snowflake 會將數字、小數和浮點值視為 TRUE 。 |
|
BOOLOR 注意:如果不是零,Snowflake 會將數字、小數和浮點值視為 TRUE 。 |
|
BOOLXOR 注意:如果不是零,Snowflake 會將數字、小數和浮點值視為 TRUE 。 |
BigQuery 不支援 Snowflake 的 BOOLXOR. 的直接替代方案 |
|
|
注意:Snowflake 至少需要兩個運算式。BigQuery 只需要一個。 |
|
|
DECODE 。使用者必須使用 IS NULL 而非 = NULL ,才能將 NULL 選取運算式與 NULL 搜尋運算式配對。 |
|
BigQuery 不支援 Snowflake 的 EQUAL_NULL. 的直接替代方案 |
|
|
|
|
|
|
|
|
|
BigQuery 不支援 Snowflake 的 IS [ NOT ] DISTINCT FROM. 的直接替代方案 |
|
|
|
BigQuery 不支援 VARIANT 資料類型。 |
|
|
|
|
|
|
|
|
|
REGR... 函式的直接替代方案。 |
|
注意:BigQuery 不支援 Snowflake REGR... 函式的直接替代方案。 |
|
|
情境函式
下表列出常見 Snowflake 上下文函式與 BigQuery 對應項目之間的對應關係。
Snowflake | BigQuery |
---|---|
注意:不是直接比較。Snowflake 會傳回帳戶 ID,BigQuery 會傳回使用者電子郵件地址。 |
|
未在 BigQuery 中使用的概念 |
|
這會傳回專案名稱的資料表。並非直接比較。 |
|
注意:Snowflake 不會強制在 CURRENT_DATE 指令後方加上 '()',以符合 ANSI 標準。 |
注意:BigQuery 的 CURRENT_DATE 支援選用的時區規格。 |
注意:與 Snowflake 的 CURRENT_REGION() 相比,BigQuery 的 INFORMATION_SCHEMA.SCHEMATA 會傳回更通用的位置參照。並非直接比較。 |
|
未在 BigQuery 中使用的概念 |
|
這會傳回專案或地區中所有可用的資料集 (又稱為結構定義) 資料表。並非直接比較。 |
|
未在 BigQuery 中使用的概念 |
|
未在 BigQuery 中使用的概念 |
|
注意:BigQuery 的 INFORMATION_SCHEMA.JOBS_BY_* 可讓您依工作類型、開始/結束類型等搜尋查詢。 |
|
注意:Snowflake 允許選用的秒數小數精確度。有效值範圍為 0 到 9 奈秒。預設值為 9。為了符合 ANSI 標準,您可以不使用 '()' 呼叫這個方法。 |
|
注意:Snowflake 允許選用的秒數小數精確度。有效值範圍為 0 到 9 奈秒。預設值為 9。為符合 ANSI 規範,您可以不使用 '()' 呼叫此方法。請將 TIMEZONE 設為工作階段參數。 |
注意:
CURRENT_DATETIME 會傳回 DATETIME 資料類型 (Snowflake 不支援)。CURRENT_TIMESTAMP 會傳回 TIMESTAMP 資料類型。 |
INFORMATION_SCHEMA.JOBS_BY_* 可讓您依工作類型、開始/結束時間等搜尋工作 ID。 |
|
注意:Snowflake 不會強制在 CURRENT_USER 指令後方加上 '()',以符合 ANSI 標準。 |
|
未在 BigQuery 中使用的概念 |
|
|
|
|
注意:BigQuery 的 INFORMATION_SCHEMA.JOBS_BY_* 可依工作類型、開始/結束時間等搜尋工作 ID。 |
注意:BigQuery 的 INFORMATION_SCHEMA.JOBS_BY_* 可依工作類型、開始/結束時間等搜尋工作 ID。 |
|
注意:Snowflake 不會強制在 LOCALTIME 指令後方加上 '()',以符合 ANSI 標準。 |
|
注意:
CURRENT_DATETIME 會傳回 DATETIME 資料類型 (Snowflake 不支援)。CURRENT_TIMESTAMP 會傳回 TIMESTAMP 資料類型。 |
轉換函式
下表列出常見 Snowflake 轉換函式與 BigQuery 對應項目之間的對應關係。
請注意,在 Snowflake 和 BigQuery 中看似相同的函式,可能會傳回不同的資料類型。
Snowflake | BigQuery |
---|---|
|
|
|
|
注意:Snowflake 支援 HEX 、BASE64 和 UTF-8 轉換。Snowflake 也支援使用 VARIANT 資料類型的 TO_BINARY 。BigQuery 沒有 VARIANT 資料類型的替代方案。 |
注意:BigQuery 的預設 STRING 轉換會使用 UTF-8 編碼。Snowflake 沒有支援 BASE32 編碼的選項。 |
注意:
|
注意:
|
注意:如要查看 Snowflake 的格式模型,請前往這個頁面。BigQuery 沒有 VARIANT 資料類型的替代方案。 |
注意:BigQuery 的輸入運算式可使用 FORMAT_DATE 、FORMAT_DATETIME 、FORMAT_TIME 或 FORMAT_TIMESTAMP 格式化。 |
注意:Snowflake 支援將 INTEGER 類型直接轉換為 DATE 類型。如要查看 Snowflake 的格式模型,請按這裡。BigQuery 沒有 VARIANT 資料類型的替代方案。 |
注意:BigQuery 的輸入運算式可使用 FORMAT 、FORMAT_DATETIME 或 FORMAT_TIMESTAMP 格式化。 |
注意:Snowflake 的 DECIMAL 、NUMBER 和 NUMERIC 資料類型的格式模型可在這裡找到。BigQuery 沒有 VARIANT 資料類型的替代方案。 |
注意:您可以使用 FORMAT. 為 BigQuery 的輸入式樣式設定格式 |
注意:Snowflake 的 DOUBLE 資料類型格式模型可在這個頁面找到。BigQuery 沒有 VARIANT 資料類型的替代方案。 |
注意:BigQuery 的輸入運算式可使用 FORMAT. 格式化 |
|
BigQuery 沒有 Snowflake 的 VARIANT 資料類型替代方案。 |
|
BigQuery 沒有 Snowflake 的 VARIANT 資料類型替代方案。 |
注意:Snowflake 的 STRING 資料類型格式模型可在這個頁面找到。BigQuery 沒有 VARIANT 資料類型的替代方案。 |
注意:BigQuery 沒有 Snowflake 的 VARIANT 資料類型替代方案。BigQuery 的輸入運算式可使用 FORMAT 、FORMAT_DATETIME 、FORMAT_TIMESTAMP 或 FORMAT_TIME 格式化。 |
注意:BigQuery 沒有 VARIANT 資料類型的替代方案。 |
注意:BigQuery 的輸入運算式可使用 FORMAT 、FORMAT_DATE 、FORMAT_DATETIME 、FORMAT_TIME 格式化。您可以透過 FORMAT_TIMESTAMP 參數加入/不加入時區。 |
|
BigQuery 沒有 Snowflake 的 VARIANT 資料類型替代方案。 |
|
BigQuery 沒有 Snowflake 的 VARIANT 資料類型替代方案。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BigQuery 也提供下列轉換函式,這些函式在 Snowflake 中沒有直接對應項目:
CODE_POINTS_TO_BYTES
CODE_POINTS_TO_STRING
FORMAT
FROM_BASE32
FROM_BASE64
FROM_HEX
SAFE_CONVERT_BYTES_TO_STRING
TO_BASE32
TO_CODE_POINTS
資料產生函式
下表列出常見 Snowflake 資料產生函式與 BigQuery 對應函式之間的對應關係。
Snowflake | BigQuery |
---|---|
|
BigQuery 不支援直接比較 Snowflake 的 NORMAL. |
|
注意:BigQuery 不支援播種 |
|
BigQuery 不支援直接比較 Snowflake 的 RANDSTR. |
SEQ1 / SEQ2 / SEQ4 / SEQ8 |
BigQuery 不支援直接比較 Snowflake 的 SEQ_. |
|
注意:請使用永久性 UDF 建立與 Snowflake 的 UNIFORM 等同的函式。請參閱這裡的範例。 |
UUID_STRING([uuid, name]) 注意:Snowflake 會傳回 128 個隨機位元。Snowflake 支援第 4 版 (隨機) 和第 5 版 (命名) UUID。 |
注意:BigQuery 會傳回 122 個隨機位元。BigQuery 僅支援第 4 版 UUID。 |
|
BigQuery 不支援直接比較 Snowflake 的 ZIPF. |
日期和時間函式
下表列出常見 Snowflake 日期和時間函式與 BigQuery 對應函式之間的對應關係。BigQuery 資料和時間函式包括日期函式、日期時間函式、時間函式和時間戳記函式。
Snowflake | BigQuery |
---|---|
|
|
|
注意:在 BigQuery 中,source_timezone 一律為世界標準時間 |
注意:Snowflake 支援溢位和負日期。舉例來說, DATE_FROM_PARTS(2000, 1 + 24, 1) 會傳回 2002 年 1 月 1 日。BigQuery 不支援這項功能。 |
|
注意:Snowflake 支援 ISO 星期幾、奈秒和紀元秒/毫秒/微秒/奈秒的部分類型。而 BigQuery 則沒有。如需 Snowflake 零件類型的完整清單,請參閱這篇文章
. |
注意:BigQuery 支援星期 (<weekday>)、微秒和毫秒部分類型。Snowflake 則不會。如要查看 BigQuery 部分類型的完整清單,請按這裡和這裡。 |
注意:Snowflake 支援納秒部分型別。而 BigQuery 則沒有。如需 Snowflake 零件類型的完整清單,請參閱這篇文章
. |
注意:BigQuery 支援週 (<weekday>)、ISO 週和 ISO 年部分類型。Snowflake 則不會。 |
|
|
注意:Snowflake 支援在這個函式中計算兩個日期、時間和時間戳記類型的差異。 |
注意:BigQuery 支援星期(<weekday>) 和 ISO 年份部分類型。 |
|
|
注意:Snowflake 支援 ISO 星期幾、奈秒和紀元秒/毫秒/微秒/奈秒的部分類型。而 BigQuery 則沒有。如需 Snowflake 零件類型的完整清單,請參閱這篇文章
. |
注意:BigQuery 支援星期 (<weekday>)、微秒和毫秒部分類型。Snowflake 則不會。如要查看 BigQuery 部分類型的完整清單,請按這裡和這裡。 |
|
|
|
|
|
|
|
注意:dowString 可能需要重新格式化。舉例來說,Snowflake 的 'su' 會是 BigQuery 的 'SUNDAY'。 |
|
注意:dowString 可能需要重新格式化。舉例來說,Snowflake 的 'su' 會是 BigQuery 的 'SUNDAY'。 |
注意:Snowflake 支援溢位時間。舉例來說, TIME_FROM_PARTS(0, 100, 0) 會傳回 01:40:00... BigQuery 不支援這項功能。BigQuery 不支援奈秒。 |
|
|
注意:BigQuery 不支援直接與 Snowflake 的 TIME_SLICE 進行精確比較。請使用 DATETINE_TRUNC 、TIME_TRUNC 、TIMESTAMP_TRUNC 等適當的資料類型。 |
|
|
注意:Snowflake 支援在這個函式中計算兩個日期、時間和時間戳記類型的差異。 |
注意:BigQuery 支援星期(<weekday>) 和 ISO 年份部分類型。 |
|
注意:BigQuery 要求時間戳記必須以 STRING 類型輸入。範例:"2008-12-25 15:30:00" |
|
|
注意:Snowflake 支援在這個函式中計算兩個日期、時間和時間戳記類型的差異。 |
注意:BigQuery 支援星期(<weekday>) 和 ISO 年份部分類型。 |
注意:Snowflake 支援納秒部分型別。而 BigQuery 則沒有。如需 Snowflake 零件類型的完整清單,請參閱這篇文章
. |
注意:BigQuery 支援週 (<weekday>)、ISO 週和 ISO 年部分類型。Snowflake 則不會。 |
|
|
BigQuery 也提供下列日期和時間函式,這些函式在 Snowflake 中並沒有直接對應的函式:
資訊結構定義和表格函式
在概念上,BigQuery 不支援許多 Snowflake 資訊結構定義和資料表函式。Snowflake 提供下列資訊結構定義和資料表函式,這些函式在 BigQuery 中並無直接對應項目:
AUTOMATIC_CLUSTERING_HISTORY
COPY_HISTORY
DATA_TRANSFER_HISTORY
DATABASE_REFRESH_HISTORY
DATABASE_REFRESH_PROGRESS, DATABASE_REFRESH_PROGRESS_BY_JOB
DATABASE_STORAGE_USAGE_HISTORY
EXTERNAL_TABLE_FILES
EXTERNAL_TABLE_FILE_REGISTRATION_HISTORY
LOGIN_HISTORY
,LOGIN_HISTORY_BY_USER
MATERIALIZED_VIEW_REFRESH_HISTORY
PIPE_USAGE_HISTORY
REPLICATION_USAGE_HISTORY
STAGE_STORAGE_USAGE_HISTORY
TASK_DEPENDENTS
VALIDATE_PIPE_LOAD
WAREHOUSE_LOAD_HISTORY
WAREHOUSE_METERING_HISTORY
以下是相關的 BigQuery 和 Snowflake 資訊結構定義和資料表函式清單。
Snowflake | BigQuery |
---|---|
QUERY_HISTORY QUERY_HISTORY_BY_* |
INFORMATION_SCHEMA.JOBS_BY_* 注意:不是直接替代方案。 |
TASK_HISTORY |
INFORMATION_SCHEMA.JOBS_BY_* 注意:不是直接替代方案。 |
BigQuery 提供下列資訊結構定義和資料表函式,這些函式在 Snowflake 中並沒有直接對應項目:
INFORMATION_SCHEMA.SCHEMATA
INFORMATION_SCHEMA.ROUTINES
INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.VIEWS
數值函式
下表列出常見 Snowflake 數值函式與 BigQuery 對應項目之間的對應關係。
Snowflake | BigQuery |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注意:BigQuery 的 CEIL 不支援指示精確度或比例的功能。 ROUND 不允許您指定向上捨入。 |
|
|
|
|
|
|
|
|
|
|
|
BigQuery 沒有 Snowflake FACTORIAL 的直接替代方案。使用使用者定義函式。 |
|
注意:BigQuery 的 FLOOR 不支援指示精確度或比例的功能。 ROUND 不允許您指定向上捨入。TRUNC 會對正數執行同義運算,但不會對負數執行,因為它會評估絕對值。 |
|
注意:雖然不是完全相符,但相似度很高。 |
|
|
|
注意: LOG 的預設基數為 10。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注意:BigQuery 傳回的值必須小於運算式,不支援相等於。 |
BigQuery 也提供下列數學函式,這些函式在 Snowflake 中並沒有直接對應的函式:
IS_INF
IS_NAN
IEEE_DIVIDE
DIV
SAFE_DIVIDE
SAFE_MULTIPLY
SAFE_NEGATE
SAFE_ADD
SAFE_SUBTRACT
RANGE_BUCKET
半結構化資料函式
字串和二進位函式
Snowflake | BigQuery |
---|---|
|
|
ASCII |
|
BASE64_DECODE_BINARY |
|
BASE64_DECODE_STRING |
|
BASE64_ENCODE |
|
BIT_LENGTH |
CHARACTER_LENGTH |
|
|
CHR,CHAR |
|
COLLATE |
自訂使用者定義函式 |
COLLATION |
自訂使用者定義函式 |
COMPRESS |
自訂使用者定義函式 |
|
CONCAT (...) 支援連結任意數量的字串。 |
CONTAINS |
自訂使用者定義函式 |
DECOMPRESS_BINARY |
自訂使用者定義函式 |
DECOMPRESS_STRING |
自訂使用者定義函式 |
EDITDISTANCE |
EDIT_DISTANCE |
ENDSWITH |
自訂使用者定義函式 |
HEX_DECODE_BINARY |
|
HEX_DECODE_STRING |
|
HEX_ENCODE |
|
ILIKE |
自訂使用者定義函式 |
ILIKE ANY |
自訂使用者定義函式 |
INITCAP |
INITCAP |
INSERT |
自訂使用者定義函式 |
LEFT |
使用者定義函式 |
LENGTH |
|
LIKE |
LIKE |
LIKE ALL |
自訂使用者定義函式 |
LIKE ANY |
自訂使用者定義函式 |
LOWER |
|
LPAD |
|
LTRIM |
|
|
|
MD5_BINARY |
自訂使用者定義函式 |
OCTET_LENGTH |
自訂使用者定義函式 |
PARSE_IP |
自訂使用者定義函式 |
PARSE_URL |
自訂使用者定義函式 |
POSITION |
|
REPEAT |
|
REPLACE |
|
REVERSE
|
|
RIGHT |
使用者定義函式 |
RPAD |
RPAD |
RTRIM |
|
RTRIMMED_LENGTH |
自訂使用者定義函式 |
SHA1,SHA1_HEX |
|
SHA1_BINARY |
自訂使用者定義函式 |
SHA2,SHA2_HEX |
自訂使用者定義函式 |
SHA2_BINARY |
自訂使用者定義函式 |
SOUNDEX |
自訂使用者定義函式 |
SPACE |
自訂使用者定義函式 |
SPLIT |
SPLIT |
SPLIT_PART |
自訂使用者定義函式 |
SPLIT_TO_TABLE |
自訂使用者定義函式 |
STARTSWITH |
自訂使用者定義函式 |
STRTOK |
注意:整個分隔符字串引數會用作單一分隔符。預設分隔符號為半形逗號。 |
STRTOK_SPLIT_TO_TABLE |
自訂使用者定義函式 |
SUBSTR,SUBSTRING |
SUBSTR |
TRANSLATE |
自訂使用者定義函式 |
TRIM |
TRIM |
TRY_BASE64_DECODE_BINARY |
自訂使用者定義函式 |
TRY_BASE64_DECODE_STRING |
|
TRY_HEX_DECODE_BINARY |
|
TRY_HEX_DECODE_STRING |
|
UNICODE |
自訂使用者定義函式 |
|
UPPER |
字串函式 (規則運算式)
Snowflake | BigQuery |
---|---|
REGEXP |
|
REGEXP_COUNT |
如果指定 position :
注意:BigQuery 使用 re2 程式庫,因此支援規則運算式;如要瞭解規則運算式語法,請參閱相關說明文件。 |
REGEXP_INSTR |
如果指定 position :
如果指定 occurrence :
注意:BigQuery 使用 re2 程式庫,因此支援規則運算式;如要瞭解規則運算式語法,請參閱相關說明文件。 |
|
|
REGEXP_REPLACE |
如果指定 replace_string :
如果指定 position :
注意:BigQuery 使用 re2 程式庫,因此支援規則運算式;如要瞭解規則運算式語法,請參閱相關說明文件。 |
REGEXP_SUBSTR |
如果指定 position :
如果指定 occurrence :
注意:BigQuery 使用 re2 程式庫,因此支援規則運算式;如要瞭解規則運算式語法,請參閱相關說明文件。 |
RLIKE |
|
系統函式
Snowflake | BigQuery |
---|---|
SYSTEM$ABORT_SESSION |
自訂使用者定義函式 |
SYSTEM$ABORT_TRANSACTION |
自訂使用者定義函式 |
SYSTEM$CANCEL_ALL_QUERIES |
自訂使用者定義函式 |
SYSTEM$CANCEL_QUERY |
自訂使用者定義函式 |
SYSTEM$CLUSTERING_DEPTH |
自訂使用者定義函式 |
SYSTEM$CLUSTERING_INFORMATION |
自訂使用者定義函式 |
SYSTEM$CLUSTERING_RATIO — Deprecated |
自訂使用者定義函式 |
SYSTEM$CURRENT_USER_TASK_NAME |
自訂使用者定義函式 |
SYSTEM$DATABASE_REFRESH_HISTORY |
自訂使用者定義函式 |
SYSTEM$DATABASE_REFRESH_PROGRESS , SYSTEM$DATABASE_REFRESH_PROGRESS_BY_JOB |
自訂使用者定義函式 |
SYSTEM$GET_AWS_SNS_IAM_POLICY |
自訂使用者定義函式 |
SYSTEM$GET_PREDECESSOR_RETURN_VALUE |
自訂使用者定義函式 |
SYSTEM$LAST_CHANGE_COMMIT_TIME |
自訂使用者定義函式 |
SYSTEM$PIPE_FORCE_RESUME |
自訂使用者定義函式 |
SYSTEM$PIPE_STATUS |
自訂使用者定義函式 |
SYSTEM$SET_RETURN_VALUE |
自訂使用者定義函式 |
SYSTEM$SHOW_OAUTH_CLIENT_SECRETS |
自訂使用者定義函式 |
SYSTEM$STREAM_GET_TABLE_TIMESTAMP |
自訂使用者定義函式 |
SYSTEM$STREAM_HAS_DATA |
自訂使用者定義函式 |
SYSTEM$TASK_DEPENDENTS_ENABLE |
自訂使用者定義函式 |
SYSTEM$TYPEOF |
自訂使用者定義函式 |
SYSTEM$USER_TASK_CANCEL_ONGOING_EXECUTIONS |
自訂使用者定義函式 |
SYSTEM$WAIT |
自訂使用者定義函式 |
SYSTEM$WHITELIST |
自訂使用者定義函式 |
SYSTEM$WHITELIST_PRIVATELINK |
自訂使用者定義函式 |
資料表函式
Snowflake | BigQuery | |
---|---|---|
GENERATOR |
自訂使用者定義函式 | |
GET_OBJECT_REFERENCES |
自訂使用者定義函式 | |
RESULT_SCAN |
自訂使用者定義函式 | |
VALIDATE |
自訂使用者定義函式 |
公用函式和雜湊函式
Snowflake | BigQuery | |
---|---|---|
GET_DDL |
功能要求 | |
HASH |
HASH 是 Snowflake 專屬的專屬函式。必須瞭解 Snowflake 使用的基礎邏輯,才能進行翻譯。 |
窗型函式
Snowflake | BigQuery | |
---|---|---|
CONDITIONAL_CHANGE_EVENT |
自訂使用者定義函式 | |
CONDITIONAL_TRUE_EVENT |
自訂使用者定義函式 | |
CUME_DIST |
CUME_DIST |
|
DENSE_RANK |
DENSE_RANK |
|
FIRST_VALUE |
FIRST_VALUE |
|
LAG |
LAG |
|
LAST_VALUE |
LAST_VALUE |
|
LEAD |
LEAD |
|
NTH_VALUE |
NTH_VALUE |
|
NTILE |
NTILE |
|
PERCENT_RANK |
PERCENT_RANK |
|
RANK |
RANK |
|
RATIO_TO_REPORT |
自訂使用者定義函式 | |
ROW_NUMBER |
ROW_NUMBER |
|
WIDTH_BUCKET |
自訂使用者定義函式 |
BigQuery 也支援 SAFE_CAST
(運算式 AS 類型名稱),如果 BigQuery 無法執行轉換,就會傳回空值 (例如 SAFE_CAST
("apple" AS INT64) 會傳回空值)。
運算子
以下各節列出 Snowflake 運算子及其 BigQuery 對應項目。
算術運算子
下表列出 Snowflake 算術運算子與 BigQuery 對應項目之間的對應關係。
Snowflake | BigQuery |
---|---|
|
|
|
|
|
注意:BigQuery 支援標準一元減號,但不會將字串格式的整數轉換為 INT64 、NUMERIC 或 FLOAT64 類型。 |
|
|
|
|
|
|
|
|
|
|
如要查看 Snowflake 在執行算術運算時的比例和精確度詳細資料,請參閱 Snowflake 說明文件。
比較運算子
Snowflake 比較運算子和 BigQuery 比較運算子相同。
邏輯/布林運算子
Snowflake 邏輯/布林運算子和 BigQuery 邏輯/布林運算子相同。
集合運算子
下表列出 Snowflake 集運算子與 BigQuery 對應項目之間的對應關係。
Snowflake | BigQuery |
---|---|
|
INTERSECT DISTINCT
|
注意: MINUS 和 EXCEPT 是同義詞。 |
|
|
|
子查詢運算子
下表列出 Snowflake 子查詢運算子與 BigQuery 對應項目之間的對應關係。
Snowflake | BigQuery |
---|---|
|
BigQuery 不支援 Snowflake 的 ALL/ANY 的直接替代方案。 |
|
|
|
|
|
注意:BigQuery 需要使用括號分隔不同的集合運算。如果重複使用相同的集合運算子,則不需要括號。 |
DML 語法
本節說明 Snowflake 和 BigQuery 之間的資料管理語言語法差異。
INSERT
陳述式
Snowflake 提供可設定的 DEFAULT
關鍵字,可用於資料欄。在 BigQuery 中,可為空值的資料欄的 DEFAULT
值為 NULL,且不支援資料欄為必填的 DEFAULT
。大多數 Snowflake INSERT
陳述式都與 BigQuery 相容。下表列出例外狀況。
Snowflake | BigQuery |
---|---|
注意:BigQuery 不支援使用 INSERT 陳述式. 插入 JSON 物件 |
VALUES (DEFAULT [, ...]) 注意:BigQuery 不支援 Snowflake OVERWRITE 的直接替代方案。請改用 DELETE 。 |
|
|
... 注意:
<intoClause> 代表上述的標準 INSERT statement 。 |
BigQuery 不支援有條件和無條件的多資料表 INSERTs 。 |
BigQuery 也支援使用子查詢插入值 (其中一個值是使用子查詢計算),而 Snowflake 不支援這項功能。例如:
INSERT INTO table (column1, column2)
VALUES ('value_1', (
SELECT column2
FROM table2
))
COPY
陳述式
Snowflake 支援將資料從暫存檔案複製到現有資料表,以及從資料表複製到命名內部暫存區、命名外部暫存區和外部位置 (Amazon S3、Google Cloud Storage 或 Microsoft Azure)。
BigQuery 不會使用 SQL COPY
指令載入資料,但您可以使用任何非 SQL 工具和選項,將資料載入 BigQuery 資料表。您也可以使用 Apache Spark 或 Apache Beam 提供的資料管道匯出端,將資料寫入 BigQuery。
UPDATE
陳述式
大部分的 Snowflake UPDATE
陳述式都與 BigQuery 相容。下表列出例外狀況。
Snowflake | BigQuery | |
---|---|---|
|
注意:BigQuery 中的所有 UPDATE 陳述式都需要 WHERE 關鍵字,後接條件。 |
DELETE
和 TRUNCATE TABLE
陳述式
DELETE
和 TRUNCATE TABLE
陳述式都能從資料表中移除資料列,且不會影響資料表結構定義或索引。
在 Snowflake 中,DELETE
和 TRUNCATE TABLE
都會使用 Snowflake 的 Time Travel 技術,在資料保留期間保留已刪除的資料,以利復原。不過,DELETE 不會刪除外部檔案的載入記錄和載入的結構描述。
在 BigQuery 中,DELETE
陳述式必須包含 WHERE
子句。如要進一步瞭解 BigQuery 中的 DELETE
,請參閱 DML 說明文件中的 BigQueryDELETE
範例。
Snowflake | BigQuery |
---|---|
|
注意:BigQuery DELETE 陳述式需要 WHERE 子句。 |
MERGE
陳述式
MERGE
陳述式可以將 INSERT
、UPDATE
和 DELETE
作業合併成單一「upsert」陳述式,並自動執行這些作業。MERGE
作業必須與每個目標資料列的最多一個來源資料列相符。
BigQuery 資料表的 DML 陳述式每日上限為 1,000 個,因此建議您將 INSERT、UPDATE 和 DELETE 陳述式合併為單一 MERGE 陳述式,如下表所示:
Snowflake | BigQuery |
---|---|
注意:Snowflake 支援 ERROR_ON_NONDETERMINISTIC_MERGE 工作階段參數,可處理非決定論性結果。 |
注意:如果要更新所有資料欄,則必須列出所有資料欄。 |
GET
和 LIST
陳述式
GET
陳述式會將資料檔案從下列任一 Snowflake 階段下載至用戶端電腦上的本機目錄/資料夾:
- 命名的內部階段
- 指定資料表的內部階段
- 目前使用者的內部階段
LIST
(LS) 陳述式會傳回在下列任一 Snowflake 階段中已排程 (即從本機檔案系統上傳或從資料表卸載) 的檔案清單:
- 命名的內部階段
- 命名的外部階段
- 指定資料表的階段
- 目前使用者的階段
BigQuery 不支援暫存概念,也沒有 GET
和 LIST
的等效項目。
PUT
和 REMOVE
陳述式
PUT
陳述式會將用戶端電腦上本機目錄/資料夾中的資料檔案上傳 (即階段) 至下列任一 Snowflake 階段:
- 命名的內部階段
- 指定資料表的內部階段
- 目前使用者的內部階段
REMOVE
(RM)
陳述式會移除在下列任一 Snowflake 內部階段中排程的檔案:
- 命名的內部階段
- 指定資料表的階段
- 目前使用者的階段
BigQuery 不支援暫存概念,也沒有 PUT
和 REMOVE
的等價項目。
DDL 語法
本節將說明 Snowflake 和 BigQuery 之間的資料定義語言語法差異。
資料庫、結構定義和共用 DDL
Snowflake 的大部分術語都與 BigQuery 一致,但 Snowflake 資料庫與 BigQuery 資料集類似。請參閱詳細的 Snowflake 與 BigQuery 術語對照表。
CREATE DATABASE
陳述式
Snowflake 支援透過資料庫管理指令建立及管理資料庫,而 BigQuery 則提供多種選項,例如使用控制台、CLI、用戶端程式庫等來建立資料集。本節將使用與 Snowflake 指令對應的 BigQuery CLI 指令,說明兩者之間的差異。
Snowflake | BigQuery |
---|---|
注意:Snowflake 提供這些命名資料庫的規定。名稱長度不得超過 255 個半形字元。 |
注意:BigQuery 的資料集命名規定與 Snowflake 相似,但名稱可包含 1024 個字元。 |
|
BigQuery 不支援取代資料集。 |
|
BigQuery 不支援建立臨時資料集。 |
|
BigQuery 不支援的概念 |
|
BigQuery 尚不支援複製資料集。 |
|
BigQuery 不支援資料集層級的時間旅行功能。不過,系統支援資料表和查詢結果的時間旅行功能。 |
|
BigQuery 不支援 DDL 中的排序。 |
|
|
|
BigQuery 不支援建立共用資料集。不過,使用者可以在建立資料集後透過控制台/UI 共用資料集。 |
注意:Snowflake 提供的自動背景維護資料檢視選項適用於次要資料庫,但 BigQuery 不支援這項功能。 |
|
BigQuery 也提供下列 bq mk
指令選項,這些選項在 Snowflake 中並沒有直接對應項目:
--location <dataset_location>
--default_table_expiration <time_in_seconds>
--default_partition_expiration <time_in_seconds>
ALTER DATABASE
陳述式
本節將使用與 Snowflake 指令相對應的 BigQuery CLI 指令,說明 ALTER 陳述式的差異。
Snowflake | BigQuery |
---|---|
|
BigQuery 不支援重新命名資料集,但支援複製資料集。 |
|
BigQuery 不支援交換資料集。 |
|
BigQuery 不支援在資料集層級管理資料保留和彙整作業。 |
|
|
|
概念在 BigQuery 中不受支援。 |
|
概念在 BigQuery 中不受支援。 |
|
概念在 BigQuery 中不受支援。 |
|
概念在 BigQuery 中不受支援。 |
|
概念在 BigQuery 中不受支援。 |
|
概念在 BigQuery 中不受支援。 |
|
概念在 BigQuery 中不受支援。 |
DROP DATABASE
陳述式
本節將使用與 Snowflake 指令對應的 BigQuery CLI 指令,說明 DROP 陳述式的差異。
Snowflake | BigQuery |
---|---|
注意:在 Snowflake 中,刪除資料庫並不會從系統中永久移除資料庫。資料庫的 DATA_RETENTION_TIME_IN_DAYS 參數會指定刪除的資料庫版本保留的天數。 |
-r 是移除資料集中的所有物件
-d 表示資料集注意:在 BigQuery 中,刪除資料集後就無法復原。此外,資料集層級不支援連鎖,因為資料集中的所有資料和物件都會遭到刪除。 |
Snowflake 也支援 UNDROP DATASET
指令,可還原已刪除資料集的最新版本。目前 BigQuery 在資料集層級不支援這項功能。
USE DATABASE
陳述式
Snowflake 提供使用 USE DATABASE
指令為使用者工作階段設定資料庫的選項。這樣一來,您就不需要在 SQL 指令中指定完整的物件名稱。BigQuery 不提供任何替代 Snowflake 的 USE DATABASE 指令。
SHOW DATABASE
陳述式
本節將使用與 Snowflake 指令對應的 BigQuery CLI 指令,說明 SHOW 陳述式的差異。
Snowflake | BigQuery |
---|---|
注意:Snowflake 提供單一選項,可列出並顯示所有資料庫的詳細資料,包括保留期間內已刪除的資料庫。 |
bq ls --format=prettyjson和 / 或
注意:在 BigQuery 中,ls 指令只會提供資料集名稱和基本資訊,而 show 指令則會提供詳細資料,例如資料集的最後修改時間戳記、ACL 和標籤。BigQuery 也會透過資訊結構定義提供更多資料集詳細資料。 |
注意:使用 TERSE 選項時,Snowflake 只會顯示資料集的特定資訊/欄位。 |
概念在 BigQuery 中不受支援。 |
BigQuery 不支援資料集層級的時間旅行概念。 | |
SHOW DATABASES
|
BigQuery 不支援依資料集名稱篩選結果。不過,系統支援依標籤篩選。 |
SHOW DATABASES
注意:根據預設,Snowflake 不會限制結果數量。不過,LIMIT 的值不得超過 10K。 |
注意:根據預設,BigQuery 只會顯示 50 個結果。 |
BigQuery 也提供下列 bq
指令選項,這些選項在 Snowflake 中並沒有直接對應項目:
- bq ls --format=pretty:傳回基本格式化的結果
- *bq ls -a:*只傳回匿名資料集 (以底線開頭的資料集)
- bq ls --all:傳回所有資料集,包括匿名資料集
- bq ls --filter labels.key:value:傳回依資料集標籤篩選的結果
- bq ls --d:排除匿名資料集的結果
- bq show --format=pretty:針對所有資料集傳回詳細的基本格式化結果
SCHEMA
管理
Snowflake 提供多個結構定義管理 指令,類似於資料庫管理指令。BigQuery 不支援建立及管理結構定義的概念。
不過,您可以在將資料載入資料表,以及建立空白資料表時,指定資料表的結構定義。此外,您也可以針對支援的資料格式,使用結構定義自動偵測功能。
SHARE
管理
Snowflake 提供多個共用管理 指令,類似於資料庫和結構定義管理指令。BigQuery 不支援建立和管理共用項目的概念。
資料表、檢視畫面和序列 DDL
CREATE TABLE
陳述式
大多數 Snowflake CREATE TABLE
陳述式都與 BigQuery 相容,但以下語法元素在 BigQuery 中並未使用:
Snowflake | BigQuery |
---|---|
注意: UNIQUE 和 PRIMARY KEY 限制僅供參考,不會由 Snowflake 系統強制執行。 |
|
其中 table_constraints 為:
注意:
UNIQUE 和 PRIMARY KEY 限制僅供參考,不會由 Snowflake 系統強制執行。 |
注意:BigQuery 不會使用 UNIQUE 、PRIMARY KEY 或 FOREIGN KEY 資料表限制。如要達到這些限制在執行查詢時提供的類似最佳化效果,請將 BigQuery 資料表分區和分群。CLUSTER BY 最多支援四個資料欄。 |
|
請參閱這個範例,瞭解如何使用 INFORMATION_SCHEMA 資料表,將資料欄名稱、資料類型和 NOT NULL 限制複製到新資料表。 |
注意:在 Snowflake 中, BACKUP NO 設定會指定「在建立快照和從快照還原時節省處理時間,並減少儲存空間」。 |
BACKUP NO 表格選項不會用到,也沒有必要使用,因為 BigQuery 會自動保留所有表格的歷史版本,最多 7 天,不會影響處理時間或帳單儲存空間。 |
其中 table_attributes 為:
|
BigQuery 支援叢集功能,可讓您以排序順序儲存鍵。 |
|
|
|
|
BigQuery 也支援 DDL 陳述式 CREATE OR REPLACE
TABLE
陳述式,如果資料表已存在,這項陳述式會覆寫資料表。
BigQuery 的 CREATE TABLE
陳述式也支援下列子句,這些子句在 Snowflake 中沒有對應項目:
如要進一步瞭解 BigQuery 中的 CREATE TABLE
,請參閱 DDL 說明文件中的 CREATE TABLE
陳述式範例。
ALTER TABLE
陳述式
本節將使用與 Snowflake 指令相對應的 BigQuery CLI 指令,說明資料表 ALTER 陳述式的差異。
Snowflake | BigQuery |
---|---|
|
|
|
BigQuery 不支援交換資料表。 |
|
BigQuery 不支援管理資料表的資料拼字。 |
|
|
|
|
此外,Snowflake 提供叢集、資料欄和限制選項,可用於變更 BigQuery 不支援的資料表。
DROP TABLE
和 UNDROP TABLE
陳述式
本節將使用與 Snowflake 指令對應的 BigQuery CLI 指令,說明 DROP 和 UNDROP 陳述式的差異。
Snowflake | BigQuery |
---|---|
注意:在 Snowflake 中,刪除資料表並不會從系統中永久移除該資料表。資料庫的 DATA_RETENTION_TIME_IN_DAYS 參數會指定要保留已刪除資料表的版本的天數。 |
-f 是用來略過執行作業的確認程序 -d 表示資料集 注意:在 BigQuery 中,刪除資料表也不會永久刪除,但快照目前只會保留 7 天。 |
|
注意:在 BigQuery 中,您必須先確定資料表存在時間的 UNIX 時間戳記 (以毫秒為單位)。然後,將這個時間戳記的資料表複製到新資料表。新資料表的名稱必須與已刪除資料表的名稱不同。 |
CREATE EXTERNAL TABLE
陳述式
BigQuery 可讓您建立永久和臨時外部資料表,並直接從下列項目查詢資料:
Snowflake 可讓您建立永久性外部資料表,在查詢時,從指定外部階段的一或多個檔案組合中讀取資料。
本節將使用與 Snowflake 指令對應的 BigQuery CLI 指令,說明 CREATE EXTERNAL TABLE 陳述式的差異。
Snowflake | BigQuery |
---|---|
CREATE [OR REPLACE] EXTERNAL TABLE
注意:Snowflake 可讓您將含有待讀取資料的檔案設為待處理檔案,並指定外部資料表的格式類型選項。BigQuery 支援所有 Snowflake 格式類型 (除了 XML 格式),包括 CSV、JSON、AVRO、Parquet 和 ORC。 |
注意:BigQuery 允許使用資料表定義檔案 [1]、JSON 結構定義檔案 [2] 或內嵌結構定義 [3],建立已連結至資料來源的永久資料表。BigQuery 不支援將檔案暫存至可讀取的狀態,也不支援指定格式類型選項。 |
|
注意:BigQuery 目前不支援 Snowflake 提供的任何選用參數選項,用於建立外部資料表。在分區方面,BigQuery 支援使用 _FILE_NAME 虛擬欄,在外部資料表上方建立分區資料表/檢視。詳情請參閱「查詢 _FILE_NAME 虛擬欄」。 |
此外,BigQuery 也支援查詢外部分區資料,這些資料採用 AVRO、Parquet、ORC、JSON 和 CSV 格式,且以預設 Hive 分區配置儲存在 Google Cloud Storage 中。
CREATE VIEW
陳述式
下表列出 CREATE VIEW
陳述式在 Snowflake 和 BigQuery 之間的對應項目。
Snowflake | BigQuery |
---|---|
|
|
|
CREATE OR REPLACE VIEW
|
|
|
不支援 | CREATE VIEW IF NOT EXISTS
|
|
在 BigQuery 中,如要建立檢視表,所有參照的物件都必須已存在。 BigQuery 可查詢外部資料來源。 |
CREATE SEQUENCE
陳述式
序列不會用於 BigQuery,但可以透過以下批次方式達成。如要進一步瞭解代理鍵和緩慢變動維度 (SCD),請參閱下列指南:
|
---|
資料載入和卸載 DDL
Snowflake 支援透過階段、檔案格式和管道管理指令來載入及卸載資料。BigQuery 也提供多種選項,例如 bq load、BigQuery 資料移轉服務、bq extract 等。本節將說明這些方法在資料載入和卸載時的差異。
帳戶和工作階段 DDL
BigQuery 不支援 Snowflake 的帳戶和工作階段概念。BigQuery 允許您透過 Cloud IAM 在所有層級管理帳戶。此外,BigQuery 尚不支援多陳述式交易。
使用者定義函式 (UDF)
使用者定義函式可讓您建立自訂作業的函式。這些函式會接受輸入資料欄、執行動作,並以值的形式傳回這些動作的結果
Snowflake 和 BigQuery 都支援使用 SQL 運算式和 JavaScript 程式碼的 UDF。
如需常見 BigQuery 自訂函式程式庫,請參閱 GoogleCloudPlatform/bigquery-utils/ GitHub 存放區。
CREATE FUNCTION
語法
下表說明 Snowflake 和 BigQuery 之間 SQL UDF 建立語法的差異。
Snowflake | BigQuery |
---|---|
|
注意:在 BigQuery SQL UDF 中,傳回資料類型為選用項目。當查詢呼叫函式時,BigQuery 會從 SQL 函式主體推測函式的結果類型。 |
|
注意:BigQuery SQL UDF 目前不支援傳回資料表類型,但這項功能已納入產品路線圖,很快就會推出。不過,BigQuery 支援傳回 STRUCT 類型的陣列。 |
注意:Snowflake 提供安全選項,可限制只有獲授權的使用者 (也就是獲授權擁有檢視畫面的角色) 才能查看 UDF 定義和詳細資料。 |
注意:函式安全性不是 BigQuery 中可設定的參數。BigQuery 支援建立 IAM 角色和權限,以便限制對基礎資料和函式定義的存取權。 |
|
注意:BigQuery 會隱含處理空值輸入內容的函式行為,因此不必另外指定為選項。 |
|
注意:函式不穩定性並非 BigQuery 中可設定的參數。所有 BigQuery UDF 的變動性都等同於 Snowflake 的 IMMUTABLE 變動性 (也就是不會執行資料庫查詢,或使用不在其引數清單中直接顯示的資訊)。 |
|
CREATE [OR REPLACE] FUNCTION
注意:使用單引號或字元序列 (例如美元符號引號) ($$) is not required or supported in BigQuery. BigQuery implicitly interprets the SQL expression. |
|
Note:Adding comments or descriptions in UDFs is currently not supported in BigQuery. |
|
Note: BigQuery supports using ANY TYPE as argument type. The function will accept an input of any type for this argument. For more information, see templated parameter in BigQuery. |
BigQuery also supports the CREATE FUNCTION IF NOT EXISTS
statement
which treats the query as successful and takes no action if a function with the
same name already exists.
BigQuery's CREATE FUNCTION
statement also supports creating
TEMPORARY or TEMP functions
,
which do not have a Snowflake equivalent. See
calling UDFs
for details on executing a BigQuery persistent UDF.
DROP FUNCTION
syntax
The following table addresses differences in DROP FUNCTION syntax between Snowflake and BigQuery.
Snowflake | BigQuery |
---|---|
|
Note: BigQuery does not require using the function's signature (argument data type) for deleting the function. |
BigQuery requires that you specify the project_name
if
the function is not located in the current project.
Additional function commands
This section covers additional UDF commands supported by Snowflake that are not directly available in BigQuery.
ALTER FUNCTION
syntax
Snowflake supports the following operations using
ALTER FUNCTION
syntax.
- Renaming a UDF
- Converting to (or reverting from) a secure UDF
- Adding, overwriting, removing a comment for a UDF
As configuring function security and adding function comments is not available in BigQuery, ALTER FUNCTION syntax is currently not supported. However, the CREATE FUNCTION statement can be used to create a UDF with the same function definition but a different name.
DESCRIBE FUNCTION
syntax
Snowflake supports describing a UDF using DESC[RIBE] FUNCTION syntax. This is currently not supported in BigQuery. However, querying UDF metadata via INFORMATION SCHEMA will be available soon as part of the product roadmap.
SHOW USER FUNCTIONS
syntax
In Snowflake, SHOW USER FUNCTIONS syntax can be used to list all UDFs for which users have access privileges. This is currently not supported in BigQuery. However, querying UDF metadata via INFORMATION SCHEMA will be available soon as part of the product roadmap.
Stored procedures
Snowflake stored procedures are written in JavaScript, which can execute SQL statements by calling a JavaScript API. In BigQuery, stored procedures are defined using a block of SQL statements.
CREATE PROCEDURE
syntax
In Snowflake, a stored procedure is executed with a CALL command while in BigQuery, stored procedures are executed like any other BigQuery function.
The following table addresses differences in stored procedure creation syntax between Snowflake and BigQuery.
Snowflake | BigQuery |
---|---|
Note: Snowflake requires that stored procedures return a single value. Hence, return data type is a required option. |
CREATE [OR REPLACE] PROCEDURE
Note: BigQuery doesn't support a return type for stored procedures. Also, it requires specifying argument mode for each argument passed. |
|
|
|
CREATE [OR REPLACE] PROCEDURE
注意:空值輸入的程序行為會在 BigQuery 中隱含處理,因此不必另外指定為選項。 |
CREATE [OR REPLACE] PROCEDURE
|
注意:程序不穩定性不是 BigQuery 中可設定的參數。這相當於 Snowflake 的 IMMUTABLE 波動率。 |
CREATE [OR REPLACE] PROCEDURE
|
注意:BigQuery 目前不支援在程序定義中新增註解或說明。 |
CREATE [OR REPLACE] PROCEDURE
注意:Snowflake 支援指定要執行的程序的呼叫端或擁有者 |
注意:BigQuery 預存程序一律會以呼叫端的身份執行 |
BigQuery 也支援 CREATE PROCEDURE IF NOT EXISTS
陳述式,如果已有名稱相同的函式,則會將查詢視為成功執行且不採取任何動作。
DROP PROCEDURE
語法
下表說明 Snowflake 和 BigQuery 之間的 DROP FUNCTION 語法差異。
Snowflake | BigQuery |
---|---|
|
注意:BigQuery 不需要使用程序的簽名 (引數資料類型) 來刪除程序。 |
如果程序不在目前專案中,BigQuery 會要求您指定 project_name
。
其他程序指令
Snowflake 提供其他指令,例如 ALTER PROCEDURE
、DESC[RIBE] PROCEDURE
和 SHOW PROCEDURES
,用於管理儲存程序。目前 BigQuery 不支援這類資料。
中繼資料和交易 SQL 陳述式
Snowflake | BigQuery |
---|---|
|
BigQuery 一律會使用快照隔離功能。詳情請參閱本文件其他部分的「一致性保證」一節。 |
|
在 BigQuery 中不使用。 |
|
不適用於 BigQuery |
|
在 BigQuery 中不使用。 |
多陳述式和多行 SQL 陳述式
Snowflake 和 BigQuery 都支援交易 (工作階段),因此支援以分號分隔的陳述式,並且會一併執行。詳情請參閱「多語句交易」。
已排程檔案的中繼資料欄
Snowflake 會自動為內部和外部階段中的檔案產生中繼資料。您可以查詢這類中繼資料,並載入至表格中,與一般資料欄並列。您可以使用下列中繼資料欄:
一致性保證和交易隔離
Snowflake 和 BigQuery 都是原子式,也就是說,在多個資料列的每個排列層級上,都符合 ACID 標準。
交易
每筆 Snowflake 交易都會指派一組專屬的開始時間 (包括毫秒),並設為交易 ID。Snowflake 僅支援 READ COMMITTED
隔離層級。不過,如果兩個陳述式位於同一筆交易中,則一個陳述式可以看到另一個陳述式所做的變更,即使這些變更尚未提交也一樣。Snowflake 交易會在資源 (資料表) 遭到修改時取得鎖定。使用者可以調整已封鎖陳述式等待陳述式逾時前的等待時間上限。如果啟用 AUTOCOMMIT
參數,系統會自動提交 DML 陳述式。
BigQuery 也支援交易。BigQuery 可透過快照隔離功能,確保樂觀並行控制 (先提交者勝),在這種情況下,查詢會在開始查詢前讀取上次提交的資料。這種做法可確保在每個資料列、每個變異版本和相同 DML 陳述式中的各資料列上,維持相同程度的一致性,同時避免發生死結。如果針對同一個資料表執行多項 DML 更新作業,BigQuery 會切換為悲觀並行控制。載入工作可以完全獨立執行,並附加至資料表。不過,BigQuery 尚未提供明確的交易邊界或工作階段。
復原
如果 Snowflake 交易的工作階段在交易提交或回滾前意外終止,交易就會處於未連結狀態。使用者應執行 SYSTEM$ABORT_TRANSACTION 來中止已分離的交易,否則 Snowflake 會在閒置四小時後回復已分離的交易。如果發生死結,Snowflake 會偵測死結,並選取較新的陳述式來回溯。如果明確開啟的交易中的 DML 陳述式失敗,變更會復原,但交易會保持開啟狀態,直到修訂或復原為止。Snowflake 中的 DDL 陳述式會自動提交,因此無法回復。
BigQuery 支援 ROLLBACK TRANSACTION
陳述式。BigQuery 中沒有 ABORT
陳述式。
資料庫限制
請務必查看 BigQuery 公開說明文件,瞭解最新的配額和限制。如要提高大量使用者的許多配額,請與 Cloud 支援團隊聯絡。
根據預設,所有 Snowflake 帳戶都會設定軟性限制。軟性上限會在建立帳戶時設定,且可能有所不同。許多 Snowflake 軟性限制可透過 Snowflake 帳戶團隊或支援單提高。
下表比較了 Snowflake 和 BigQuery 資料庫的限制。
限制 | Snowflake | BigQuery |
---|---|---|
查詢文字大小 | 1 MB | 1 MB |
並行查詢的數量上限 | XS 倉庫 - 8 S 倉庫 - 16 M 倉庫 - 32 L 倉庫 - 64 XL 倉庫 - 128 |
100 |