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) REWRITE_ZERO_SCALE_NUMERIC_AS_INTEGER 設定選項可用於將 INTEGER 和相關類型轉換為 INT64 。 |
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 沒有直接替代 Snowflake 的 BEFORE,可使用陳述式 ID。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 個分組集 |
|
|
注意:每個 Cube 最多可有 7 個元素 (128 個分組集) |
|
ORDER BY
子句
Snowflake ORDER BY
子句和 BigQuery ORDER BY
子句之間有些微差異。
Snowflake | BigQuery | |
---|---|---|
在 Snowflake 中,NULL 預設會排在最後 (遞增順序)。 |
在 BigQuery 中,NULLS 預設會依遞增順序排序。 |
|
您可以分別使用 NULLS FIRST 或 NULLS LAST ,指定 NULL 值應排在最前面或最後面。 |
在 BigQuery 中,沒有對應的選項可指定 NULL 值應為第一個或最後一個。 |
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 不支援搭配視窗函式的 APPROX_COUNT_DISTINCT |
注意:Snowflake 沒有 RESPECT NULLS 選項, |
注意:BigQuery 不支援搭配視窗函式的 APPROX_QUANTILES |
|
BigQuery 不支援在預測近似值時儲存中間狀態。 |
|
BigQuery 不支援在預測近似值時儲存中間狀態。 |
|
BigQuery 不支援在預測近似值時儲存中間狀態。 |
注意:如未指定數字參數,預設值為 1。計數器應明顯大於數字。 |
注意:BigQuery 不支援搭配視窗函式使用 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 不支援搭配視窗函式的 HLL_COUNT… 。使用者無法在單一 HLL_COUNT... 函式中加入多個運算式。 |
注意:Snowflake 不允許您指定精確度。 |
HLL_COUNT.INIT (expression [, precision]) |
|
HLL_COUNT.MERGE_PARTIAL (草稿) |
|
|
|
BigQuery 不支援 Snowflake 的 HLL_EXPORT 直接替代方案。 |
|
BigQuery 不支援 Snowflake 的 HLL_IMPORT 直接替代方案。 |
|
BigQuery 不支援 Snowflake 的 KURTOSIS 直接替代方案。 |
|
|
注意:Snowflake 不支援在 ARRAY_AGG. 中直接 IGNORE|RESPECT NULLS 和 LIMIT |
|
|
|
|
您可以使用自訂 UDF,透過 k 個不同的雜湊函式實作 MINHASH 。減少 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 未使用的概念 |
|
這會傳回專案名稱的資料表。這不是直接比較。 |
|
注意:為符合 ANSI 標準,Snowflake 不會在 CURRENT_DATE 指令後強制加上「()」。 |
注意:BigQuery 的 CURRENT_DATE 支援選用時區規格。 |
注意:BigQuery 的 INFORMATION_SCHEMA.SCHEMATA 傳回的位置參照比 Snowflake 的 CURRENT_REGION() 更一般化。這不是直接比較。 |
|
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。 |
|
注意:為符合 ANSI 標準,Snowflake 不會在 CURRENT_USER 指令後強制加上「()」。 |
|
BigQuery 未使用的概念 |
|
|
|
|
注意:BigQuery 的 INFORMATION_SCHEMA.JOBS_BY_* 允許依工作類型、開始/結束類型等搜尋工作 ID。 |
注意:BigQuery 的 INFORMATION_SCHEMA.JOBS_BY_* 允許依工作類型、開始/結束類型等搜尋工作 ID。 |
|
注意:為符合 ANSI 標準,Snowflake 不會在 LOCALTIME 指令後強制加上「()」。 |
|
注意:
CURRENT_DATETIME 會傳回 DATETIME 資料類型 (Snowflake 不支援)。CURRENT_TIMESTAMP 會傳回 TIMESTAMP 資料類型。 |
轉換函式
下表列出常見的 Snowflake 轉換函式及其對應的 BigQuery 函式。
請注意,Snowflake 和 BigQuery 中看似相同的函式可能會傳回不同的資料類型。
雪花 | 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 格式化。 |
注意:如要瞭解 DECIMAL 、NUMBER 和 NUMERIC 資料類型的 Snowflake 格式模型,請參閱這篇文章。BigQuery 沒有 VARIANT 資料型別的替代方案。 |
注意:BigQuery 的輸入運算式可使用 FORMAT. |
注意:如要查看 DOUBLE 資料類型的 Snowflake 格式模型,請參閱這個網頁。BigQuery 沒有 VARIANT 資料型別的替代方案。 |
注意:BigQuery 的輸入運算式可使用 FORMAT. |
|
BigQuery 沒有 Snowflake VARIANT 資料類型的替代方案。 |
|
BigQuery 沒有 Snowflake VARIANT 資料類型的替代方案。 |
注意:如要查看 STRING 資料類型的 Snowflake 格式模型,請參閱這個網頁。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 函式。
雪花 | 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 的日期和時間函式包括日期函式、日期時間函式、時間函式和時間戳記函式。
雪花 | BigQuery |
---|---|
|
|
|
注意:BigQuery 中的 source_timezone 一律為世界標準時間 |
注意:Snowflake 支援溢位和負數日期。舉例來說, DATE_FROM_PARTS(2000, 1 + 24, 1) 會傳回 2002 年 1 月 1 日。BigQuery 不支援這項功能。 |
|
注意:Snowflake 支援星期幾 (ISO)、奈秒和紀元秒/毫秒/微秒/奈秒部分類型。但 BigQuery 不會。如需完整的 Snowflake 零件類型清單,請參閱這裡
. |
注意:BigQuery 支援 week(<weekday>)、microsecond 和 millisecond 部分類型。但 Snowflake 不會。如需 BigQuery 零件類型的完整清單,請參閱這個網頁和這個網頁。 |
注意:Snowflake 支援奈秒部分類型。但 BigQuery 不會。如需完整的 Snowflake 零件類型清單,請參閱這裡
. |
注意:BigQuery 支援 week(<weekday>)、ISO week 和 ISO year 部分類型。但 Snowflake 不會。 |
|
|
注意:Snowflake 支援使用這個函式計算兩個日期、時間和時間戳記類型之間的差異。 |
注意:BigQuery 支援 week(<weekday>) 和 ISO 年份部分類型。 |
|
|
注意:Snowflake 支援星期幾 (ISO)、奈秒和紀元秒/毫秒/微秒/奈秒部分類型。但 BigQuery 不會。如需完整的 Snowflake 零件類型清單,請參閱這裡
. |
注意:BigQuery 支援 week(<weekday>)、microsecond 和 millisecond 部分類型。但 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 支援 week(<weekday>) 和 ISO 年份部分類型。 |
|
注意:BigQuery 規定時間戳記必須以 STRING 類型輸入。範例:"2008-12-25 15:30:00" |
|
|
注意:Snowflake 支援使用這個函式計算兩個日期、時間和時間戳記類型之間的差異。 |
注意:BigQuery 支援 week(<weekday>) 和 ISO 年份部分類型。 |
注意:Snowflake 支援奈秒部分類型。但 BigQuery 不會。如需完整的 Snowflake 零件類型清單,請參閱這裡
. |
注意:BigQuery 支援 week(<weekday>)、ISO week 和 ISO year 部分類型。但 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 資訊結構定義與資料表函式。
雪花 | 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 函式。
雪花 | 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
半結構化資料函式
字串和二進位函式
雪花 | 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 |
字串函式 (規則運算式)
雪花 | 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 |
|
系統功能
雪花 | 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 |
自訂使用者定義函式 |
資料表函式
雪花 | BigQuery | |
---|---|---|
GENERATOR |
自訂使用者定義函式 | |
GET_OBJECT_REFERENCES |
自訂使用者定義函式 | |
RESULT_SCAN |
自訂使用者定義函式 | |
VALIDATE |
自訂使用者定義函式 |
公用和雜湊函式
雪花 | BigQuery | |
---|---|---|
GET_DDL |
功能要求 | |
HASH |
HASH 是 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
(expression AS typename),如果 BigQuery 無法執行轉換 (例如 SAFE_CAST
("apple" AS INT64) 會傳回 NULL),則會傳回 NULL。
運算子
以下各節列出 Snowflake 運算子及其 BigQuery 對應項目。
算術運算子
下表顯示 Snowflake 算術運算子與對應的 BigQuery 運算子。
雪花 | BigQuery |
---|---|
|
|
|
|
|
注意:BigQuery 支援標準一元負號,但不會將字串格式的整數轉換為 INT64 、NUMERIC 或 FLOAT64 型別。 |
|
|
|
|
|
|
|
|
|
|
如要在執行算術運算時查看 Snowflake 的位數和精確度詳細資料,請參閱 Snowflake 說明文件。
比較運算子
Snowflake 比較運算子與 BigQuery 比較運算子相同。
邏輯/布林運算子
Snowflake 邏輯/布林運算子與 BigQuery 邏輯/布林運算子相同。
集合運算子
下表顯示 Snowflake set 運算子與對應的 BigQuery 運算子。
雪花 | BigQuery |
---|---|
|
INTERSECT DISTINCT
|
注意: MINUS 和 EXCEPT 是同義詞。 |
|
|
|
子查詢運算子
下表顯示 Snowflake 子查詢運算子與對應 BigQuery 運算子的對應關係。
雪花 | BigQuery |
---|---|
|
BigQuery 不支援 Snowflake 的 ALL/ANY 直接替代方案。 |
|
|
|
|
|
注意:BigQuery 必須使用括號分隔不同的集合運算。如果重複使用相同的集合運算子,則不需要括號。 |
DML 語法
本節說明 Snowflake 和 BigQuery 之間資料管理語言語法的差異。
INSERT
陳述式
Snowflake 提供可設定的資料欄 DEFAULT
關鍵字。在 BigQuery 中,可為空值的資料欄的 DEFAULT
值為 NULL,且必要資料欄不支援 DEFAULT
。大多數 Snowflake INSERT
陳述式都與 BigQuery 相容。下表列出例外狀況。
雪花 | 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 相容。下表列出例外狀況。
雪花 | BigQuery | |
---|---|---|
|
注意:BigQuery 中的所有 UPDATE 陳述式都必須包含 WHERE 關鍵字,後接條件。 |
DELETE
和 TRUNCATE TABLE
陳述式
DELETE
和 TRUNCATE TABLE
陳述式都能從資料表中移除資料列,且不會影響資料表結構定義或索引。
在 Snowflake 中,DELETE
和 TRUNCATE TABLE
都會使用 Snowflake 的 Time Travel 保留已刪除的資料,以便在資料保留期間內復原資料。不過,DELETE 不會刪除外部檔案載入記錄和載入中繼資料。
在 BigQuery 中,DELETE
陳述式必須有 WHERE
子句。如要進一步瞭解 BigQuery 中的 DELETE
,請參閱 DML 說明文件中的 BigQuery DELETE
範例。
雪花 | BigQuery |
---|---|
|
注意:BigQuery DELETE 陳述式需要 WHERE 子句。 |
MERGE
陳述式
MERGE
陳述式可將 INSERT
、UPDATE
和 DELETE
作業結合成單一「upsert」陳述式,並自動執行這些作業。每個目標資料列的 MERGE
作業最多只能與一個來源資料列相符。
BigQuery 資料表每天最多只能執行 1,000 個 DML 陳述式,因此您應盡可能將 INSERT、UPDATE 和 DELETE 陳述式合併為單一 MERGE 陳述式,如下表所示:
雪花 | 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 指令,解決兩者之間的差異。
雪花 | 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 陳述式中的差異。
雪花 | BigQuery |
---|---|
|
BigQuery 不支援重新命名資料集,但支援複製資料集。 |
|
BigQuery 不支援交換資料集。 |
|
BigQuery 不支援在資料集層級管理資料保留和對照。 |
|
|
|
BigQuery 不支援這個概念。 |
|
BigQuery 不支援這個概念。 |
|
BigQuery 不支援這個概念。 |
|
BigQuery 不支援這個概念。 |
|
BigQuery 不支援這個概念。 |
|
BigQuery 不支援這個概念。 |
|
BigQuery 不支援這個概念。 |
DROP DATABASE
陳述式
本節將使用對應於 Snowflake 指令的 BigQuery CLI 指令,解決 DROP 陳述式中的差異。
雪花 | 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 陳述式中的差異。
雪花 | 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 不支援建立及管理結構定義的概念。
不過,BigQuery 可讓您在將資料載入資料表,以及建立空白資料表時指定資料表結構定義。此外,您也可以針對支援的資料格式,使用結構定義自動偵測功能。
管理 SHARE
Snowflake 提供多個共用管理 指令,與資料庫和結構定義管理指令類似。BigQuery 不支援建立及管理共用內容的概念。
資料表、檢視區塊和序列 DDL
CREATE TABLE
陳述式
大多數 Snowflake CREATE TABLE
陳述式都與 BigQuery 相容,但下列語法元素除外,因為 BigQuery 不會使用這些元素:
雪花 | BigQuery |
---|---|
注意: UNIQUE 和 PRIMARY KEY 限制僅供參考,Snowflake 系統不會強制執行。 |
|
where table_constraints are:
注意:
UNIQUE 和 PRIMARY KEY 限制僅供參考,Snowflake 系統不會強制執行。 |
注意:BigQuery 不會使用 UNIQUE 、PRIMARY KEY 或 FOREIGN KEY 資料表限制。如要達到類似的最佳化效果,請在執行查詢時,對 BigQuery 資料表進行分區和分群。CLUSTER BY 最多支援四個資料欄。 |
|
請參閱這個範例,瞭解如何使用 INFORMATION_SCHEMA 資料表將資料欄名稱、資料類型和 NOT NULL 限制複製到新資料表。 |
注意:在 Snowflake 中, BACKUP NO 設定指定為「在建立快照及從快照還原時節省處理時間,並減少儲存空間」。 |
BigQuery 會自動保留所有資料表最多 7 天的歷史版本,且不會影響處理時間或計費儲存空間,因此不需要也不會使用 BACKUP NO 資料表選項。 |
where table_attributes are:
|
BigQuery 支援叢集,可依排序順序儲存鍵。 |
|
|
|
|
BigQuery 也支援 DDL 陳述式 CREATE OR REPLACE
TABLE
,如果資料表已存在,系統會覆寫該資料表。
BigQuery 的 CREATE TABLE
陳述式也支援下列子句,這些子句沒有對應的 Snowflake 子句:
如要進一步瞭解 BigQuery 中的 CREATE TABLE
,請參閱 DDL 說明文件中的CREATE TABLE
陳述式範例。
ALTER TABLE
陳述式
本節將使用對應於 Snowflake 指令的 BigQuery CLI 指令,解決資料表 ALTER 陳述式的差異。
雪花 | BigQuery |
---|---|
|
|
|
BigQuery 不支援交換資料表。 |
|
BigQuery 不支援管理資料表資料的排序規則。 |
|
|
|
|
此外,Snowflake 還提供分群、資料欄和限制選項,可供修改 BigQuery 不支援的資料表。
DROP TABLE
和 UNDROP TABLE
陳述式
本節將使用對應於 Snowflake 指令的 BigQuery CLI 指令,解決 DROP 和 UNDROP 陳述式之間的差異。
雪花 | BigQuery |
---|---|
注意:在 Snowflake 中,捨棄表格不會從系統中永久移除表格。系統會保留已捨棄的資料表版本,保留天數由資料庫的 DATA_RETENTION_TIME_IN_DAYS 參數指定。 |
-f:略過執行確認步驟 -d:表示資料集 注意:在 BigQuery 中,刪除資料表並非永久刪除,但目前只會保留 7 天的快照。 |
|
注意:在 BigQuery 中,您必須先確定資料表存在時間的 UNIX 時間戳記 (以毫秒為單位)。然後,將這個時間戳記的資料表複製到新資料表。新資料表的名稱必須與已刪除資料表的名稱不同。 |
CREATE EXTERNAL TABLE
陳述式
BigQuery 允許建立永久和臨時外部資料表,並直接從下列項目查詢資料:
Snowflake 允許建立永久外部資料表,查詢時會從指定外部暫存區的一或多個檔案讀取資料。
本節將使用對應於 Snowflake 指令的 BigQuery CLI 指令,解決 CREATE EXTERNAL TABLE 陳述式中的差異。
雪花 | BigQuery |
---|---|
CREATE [OR REPLACE] EXTERNAL TABLE
注意:Snowflake 允許暫存含有待讀取資料的檔案,並為外部資料表指定格式類型選項。BigQuery 支援所有 Snowflake 格式類型 (CSV、JSON、AVRO、PARQUET、ORC),但 XML 類型除外。 |
注意: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
陳述式
下表列出 Snowflake 和 BigQuery 中 CREATE VIEW
陳述式的對等項目。
雪花 | 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)
您可以透過 UDF 建立自訂作業的函式。這些函式會接受輸入資料欄並執行各項動作,再以資料值的形式傳回這些動作的結果。
Snowflake 和 BigQuery 都支援使用 SQL 運算式和 JavaScript 程式碼的 UDF。
如需常見 BigQuery UDF 的程式庫,請參閱 GoogleCloudPlatform/bigquery-utils/ GitHub 存放區。
CREATE FUNCTION
語法
下表說明 Snowflake 和 BigQuery 之間 SQL UDF 建立語法的差異。
雪花 | BigQuery |
---|---|
|
注意:在 BigQuery SQL UDF 中,傳回資料類型為選用項目。當查詢呼叫函式時,BigQuery 會從 SQL 函式主體推測出函式的結果類型。 |
|
注意:BigQuery SQL UDF 目前不支援傳回資料表類型,但這項功能已列入產品藍圖,即將推出。不過,BigQuery 支援傳回 STRUCT 類型的 ARRAY。 |
注意: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 語法的差異。
雪花 | BigQuery |
---|---|
|
注意:BigQuery 不會要求使用程序的簽章 (引數資料類型) 刪除程序。 |
如果程序並非位在目前專案中,BigQuery 會要求您指定 project_name
。
其他程序指令
Snowflake 提供其他指令,例如 ALTER PROCEDURE
、DESC[RIBE] PROCEDURE
和 SHOW PROCEDURES
,可管理預存程序。BigQuery 目前不支援這些功能。
中繼資料和交易 SQL 陳述式
雪花 | 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 的資料庫限制。
限制 | 雪花 | BigQuery |
---|---|---|
查詢文字大小 | 1 MB | 1 MB |
並行查詢數量上限 | XS Warehouse - 8 S Warehouse - 16 M Warehouse - 32 L Warehouse - 64 XL Warehouse - 128 |
100 |