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 |
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 数据类型采用“> X”的模式建立“NaN”,其中 X 是任意的 FLOAT 值(“NaN”本身除外)。BigQuery 中的 FLOAT 数据类型采用“< X”的模式建立“NaN”,其中 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 别名和标识符不区分大小写。如需保留大小写,可以使用英文双引号 (") 将别名和标识符括起来。
FROM
子句
查询中的 FROM
子句指定可在 SELECT 语句中使用的表、视图、子查询或表函数。BigQuery 支持所有这些表引用。
下表列出了一些细微差异。
Snowflake | BigQuery | |
---|---|---|
|
WITH table1 AS |
|
|
|
|
|
注意:对于 Snowflake 中使用语句 ID 的 BEFORE 函数,BigQuery 没有直接的对应项。“timestamp”的值不得早于当前时间戳之前 7 天。 |
|
|
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 子句是 CROSS JOIN 或其中一个联接表是数据类型或数组中的某个字段,否则都需要使用 JOIN 条件。 |
|
注意:与非横向联接的输出不同,横向联接的输出仅包含从内嵌视图生成的行。左侧的行不需要联接到右侧,因为左侧的行已通过传递到内嵌视图而被考虑在内。 |
LATERAL JOIN ,BigQuery 没有直接的对应项。 |
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 值是排在最前还是最后。 |
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
子句用于过滤窗口函数的结果,它与使用聚合函数和 GROUP BY
子句的 HAVING
效果类似。
Snowflake | BigQuery | |
---|---|---|
|
具有分析函数(如 ROW_NUMBER() 和 COUNT() )且包含 OVER PARTITION BY 的 Snowflake QUALIFY 子句在 BigQuery 中表示为包含该分析值的子查询的 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 不支持存储中间状态。 |
注意:如果未指定 number 参数,则默认为 1。计数器数量应远大于 number 参数的值。 |
注意:BigQuery 不支持将 APPROX_TOP_COUNT 与窗口函数搭配使用。 |
|
在预测近似值时,BigQuery 不支持存储中间状态。 |
|
在预测近似值时,BigQuery 不支持存储中间状态。 |
|
在预测近似值时,BigQuery 不支持存储中间状态。 |
|
您可以使用自定义 UDF 来实现包含 k distinct 哈希函数的 MINHASH 。另一种减小 MINHASH 中方差的方法是保留一个哈希函数最小值中的 k 。在这种情况下,Jaccard 指数近似如下:
|
|
它与 APPROXIMATE_JACCARD_INDEX 含义相同,可通过相同的方式实现。 |
|
|
|
注意:BigQuery 中的 AVG 不会对 STRING 执行自动类型转换。 |
|
INTEGER 。 |
|
注意:BigQuery 不会将字符/文本列隐式转换为最接近的 INTEGER 。 |
|
注意:BigQuery 不会将字符/文本列隐式转换为最接近的 INTEGER 。 |
注意:Snowflake 允许将非零数值、小数和浮点值视为 TRUE 。 |
|
注意:Snowflake 允许将非零数值、小数和浮点值视为 TRUE 。 |
|
注意:Snowflake 允许将非零数值、小数和浮点值视为 TRUE 。 |
对于数值表达式:
如需使用 OVER ,您可以运行以下命令(提供了布尔示例):
|
|
|
|
|
|
|
|
|
|
对于 Snowflake 中的 GROUPING ,BigQuery 没有直接的对应项。可通过用户定义的函数实现。 |
|
对于 Snowflake 中的 GROUPING_ID ,BigQuery 没有直接的对应项。可通过用户定义的函数实现。 |
|
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 (sketch) |
|
|
|
对于 Snowflake 中的 HLL_EXPORT ,BigQuery 没有直接的对应项。 |
|
对于 Snowflake 中的 HLL_IMPORT ,BigQuery 没有直接的对应项。 |
|
对于 Snowflake 中的 KURTOSIS ,BigQuery 没有直接的对应项。 |
|
|
注意:Snowflake 不支持直接在 ARRAY_AGG. 中执行 IGNORE|RESPECT NULLS 和 LIMIT |
|
|
|
|
您可以使用自定义 UDF 来实现包含 k distinct 哈希函数的 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 格式的字符串 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
对于 Snowflake 中的 SKEW ,BigQuery 没有直接的对应项。 |
|
|
|
|
|
|
|
|
注意: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 。 |
对于 Snowflake 中的 BOOLXOR. ,BigQuery 没有直接的对应项。 |
|
|
注意:Snowflake 至少需要两个表达式;而 BigQuery 只需要一个表达式。 |
|
|
DECODE 。用户必须使用 IS NULL 代替 = NULL 来将 NULL 选择表达式与 NULL 搜索表达式进行匹配。 |
|
对于 Snowflake 中的 EQUAL_NULL. ,BigQuery 没有直接的对应项。 |
|
|
|
|
|
|
|
|
|
对于 Snowflake 中的 IS [ NOT ] DISTINCT FROM. ,BigQuery 没有直接的对应项。 |
|
|
|
BigQuery 不支持 VARIANT 数据类型。 |
|
|
|
|
|
|
|
|
|
REGR... 函数,BigQuery 没有直接的对应项。 |
|
注意:对于 Snowflake 中的 REGR... 函数,BigQuery 没有直接的对应项。 |
|
|
上下文函数
下表展示了常见的 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 。对于 VARIANT 数据类型,BigQuery 没有对应项。 |
注意:BigQuery 的默认 STRING 类型转换使用 UTF-8 编码。Snowflake 不支持 BASE32 编码。 |
注意:
|
注意:
|
注意:您可以在此处找到 Snowflake 的格式模型。对于 VARIANT 数据类型,BigQuery 没有对应项。 |
注意:BigQuery 的输入表达式可以使用 FORMAT_DATE 、FORMAT_DATETIME 、FORMAT_TIME 或 FORMAT_TIMESTAMP 设置格式。 |
注意:Snowflake 支持将 INTEGER 类型直接转换为 DATE 类型。您可以在此处找到 Snowflake 的格式模型。对于 VARIANT 数据类型,BigQuery 没有对应项。 |
注意:BigQuery 的输入表达式可以使用 FORMAT 、FORMAT_DATETIME 或 FORMAT_TIMESTAMP 设置格式。 |
注意:您可以在此处找到 Snowflake 中适用于 DECIMAL 、NUMBER 和 NUMERIC 数据类型的格式模型。对于 VARIANT 数据类型,BigQuery 没有对应项。 |
注意:BigQuery 的输入表达式可以使用 FORMAT. 设置格式。 |
注意:您可以在此处找到 Snowflake 中适用于 DOUBLE 数据类型的格式模型。对于 VARIANT 数据类型,BigQuery 没有对应项。 |
注意:BigQuery 的输入表达式可以使用 FORMAT. 设置格式。 |
|
对于 Snowflake 中的 VARIANT 数据类型,BigQuery 没有对应项。 |
|
对于 Snowflake 中的 VARIANT 数据类型,BigQuery 没有对应项。 |
注意:您可以在此处找到 Snowflake 中适用于 STRING 数据类型的格式模型。对于 VARIANT 数据类型,BigQuery 没有对应项。 |
注意:对于 Snowflake 中的 VARIANT 数据类型,BigQuery 没有对应项。BigQuery 的输入表达式可以使用 FORMAT 、FORMAT_DATETIME 、FORMAT_TIMESTAMP 或 FORMAT_TIME 设置格式。 |
注意:对于 VARIANT 数据类型,BigQuery 没有对应项。 |
注意:BigQuery 的输入表达式可以使用 FORMAT 、FORMAT_DATE 、FORMAT_DATETIME 或 FORMAT_TIME 设置格式。可以通过 FORMAT_TIMESTAMP 参数选择添加/不添加时区。 |
|
对于 Snowflake 中的 VARIANT 数据类型,BigQuery 没有对应项。 |
|
对于 Snowflake 中的 VARIANT 数据类型,BigQuery 没有对应项。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
---|---|
|
对于 Snowflake 中的 NORMAL. ,BigQuery 没有直接的对应项。 |
|
注意:BigQuery 不支持种子设定 |
|
对于 Snowflake 中的 RANDSTR. ,BigQuery 没有直接的对应项。 |
SEQ1 / SEQ2 / SEQ4 / SEQ8 |
对于 Snowflake 中的 SEQ_. ,BigQuery 没有直接的对应项。 |
|
注意:对于 Snowflake 中的 UNIFORM ,可以使用永久性 UDF 来创建等效项。请参阅此处的示例。 |
UUID_STRING([uuid, name]) 注意:Snowflake 会返回 128 个随机位。Snowflake 支持版本 4(随机)和版本 5(命名)UUID。 |
注意:BigQuery 会返回 122 个随机位。BigQuery 仅支持版本 4 UUID。 |
|
对于 Snowflake 中的 ZIPF. ,BigQuery 没有直接的对应项。 |
日期和时间函数
下表展示了常见的 Snowflake 日期和时间函数与其 BigQuery 等效项之间的对应关系。BigQuery 数据和时间函数包括日期函数、日期时间函数、时间函数和时间戳函数。
Snowflake | BigQuery |
---|---|
|
|
|
注意:在 BigQuery 中,source_timezone 始终为 UTC |
注意:Snowflake 支持溢出日期和负日期。例如, DATE_FROM_PARTS(2000, 1 + 24, 1) 会返回 2002 年 1 月 1 日。BigQuery 则不支持此行为。 |
|
注意:Snowflake 支持 ISO 格式星期几、纳秒以及纪元秒/毫秒/微秒/纳秒分部类型。BigQuery 则不支持此行为。您可以在此处
. 找到 Snowflake 分部类型的完整列表 |
注意:BigQuery 支持 week(<weekday>)、微秒和毫秒分部类型。Snowflake 则不支持此行为。您可以在此处以及此处找到 BigQuery 分部类型的完整列表。 |
注意:Snowflake 支持纳秒分部类型。BigQuery 则不支持此行为。您可以在此处
. 找到 Snowflake 分部类型的完整列表 |
注意:BigQuery 支持 week(<weekday>)、ISO 格式周数和 ISO 格式年份分部类型。Snowflake 则不支持此行为。 |
|
|
注意:Snowflake 支持在此函数中计算两种日期、时间和时间戳类型之间的差异。 |
注意:BigQuery 支持 week(<weekday>) 和 ISO 格式年份分部类型。 |
|
|
注意:Snowflake 支持 ISO 格式星期几、纳秒以及纪元秒/毫秒/微秒/纳秒分部类型。BigQuery 则不支持此行为。您可以在此处
. 找到 Snowflake 分部类型的完整列表 |
注意:BigQuery 支持 week(<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 不支持纳秒。 |
|
|
注意:对于 Snowflake 中的 TIME_SLICE ,BigQuery 没有直接的确切对应项。可使用 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 格式周数和 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 不允许指定向上舍入。 |
|
|
|
|
|
|
|
|
|
|
|
对于 Snowflake 中的 FACTORIAL ,BigQuery 没有直接的对应项。可使用用户定义的函数来实现此行为。 |
|
注意: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 | |
---|---|---|
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 无法执行类型转换,则返回 NULL(例如,SAFE_CAST
("apple" AS INT64) 便会返回 NULL)。
运算符
以下部分列出了 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 |
---|---|
|
对于 Snowflake 中的 ALL/ANY,BigQuery 没有直接的对应项。 |
|
|
|
|
|
注意:BigQuery 需要使用英文括号来分隔不同的集合运算。如果重复同一集合运算符,则不需要使用英文括号。 |
DML 语法
本部分介绍了 Snowflake 和 BigQuery 在数据管理语言语法上的差异。
INSERT
语句
Snowflake 为列提供可配置的 DEFAULT
关键字。在 BigQuery 中,可为 null 的列的 DEFAULT
值为 NULL,而必需的列不支持 DEFAULT
。大多数 Snowflake INSERT
语句都与 BigQuery 兼容。下表显示了例外情况。
Snowflake | BigQuery |
---|---|
注意:BigQuery 不支持通过 INSERT 语句. 插入 JSON 对象 |
VALUES (DEFAULT [, ...]) 注意:对于 Snowflake 中的 OVERWRITE ,BigQuery 没有直接的对应项。请改用 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 的时间旅行来保留已删除的数据,以便能够在数据保留期限内恢复数据。不过,DELETE 不会删除外部文件加载记录和加载元数据。
在 BigQuery 中,DELETE
语句必须具有 WHERE
子句。 如需详细了解 BigQuery 中的 DELETE
,请参阅 DML 文档中的 BigQuery DELETE
示例。
Snowflake | BigQuery |
---|---|
|
注意:BigQuery DELETE 语句需要有 WHERE 子句。 |
MERGE
语句
MERGE
语句可以将 INSERT
、UPDATE
和 DELETE
操作合并为一个“upsert”语句,并自动执行这些操作。对应每个目标行,MERGE
操作必须匹配最多一个源行。
由于 BigQuery 表每天最多只能运行 1,000 个 DML 语句,因此您最好将 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 不支持创建共享数据集。不过,创建数据集后,用户可以通过控制台/界面共享数据集。 |
注意: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 命令中指定完全限定的对象名称。对于 Snowflake 中的 USE DATABASE 命令,BigQuery 没有任何对应项。
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 不支持创建和管理架构的概念。
不过,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 允许暂存包含要读取的数据的文件,并允许为外部表指定格式类型选项。Snowflake 格式格式 - CSV、JSON、AVRO、PARQUET、ORC 均受 BigQuery 支持(但 XML 类型除外)。 |
注意:BigQuery 允许使用表定义文件 [1]、JSON 架构文件 [2] 或内嵌架构定义 [3] 创建链接到数据源的永久表。BigQuery 不支持暂存要读取的文件,也不支持指定格式类型选项。 |
|
注意:BigQuery 目前不支持 Snowflake 提供的任何用于创建外部表的可选参数选项。对于分区,BigQuery 支持使用 _FILE_NAME 伪列在外部表之上创建分区表/视图。如需了解详情,请参阅查询 _FILE_NAME 伪列。 |
此外,BigQuery 还支持使用默认 hive 分区布局查询存储在 Google Cloud Storage 中的 AVRO、PARQUET、ORC、JSON 和 CSV 格式的外部分区数据。
CREATE VIEW
语句
下表显示了 Snowflake 和 BigQuery 中 CREATE VIEW
语句的等效项。
Snowflake | BigQuery |
---|---|
|
|
|
CREATE OR REPLACE VIEW
|
|
|
不支持 | CREATE VIEW IF NOT EXISTS
|
|
在 BigQuery 中,如需创建视图,所有引用的对象都必须已存在。 BigQuery 允许查询外部数据源。 |
CREATE SEQUENCE
语句
序列在 BigQuery 中不适用,但可通过以下批处理方法实现。如需详细了解代理键和缓慢变化维度 (SCD),请参阅以下指南:
|
---|
数据加载和卸载 DDL
Snowflake 支持通过暂存区、文件格式和管道管理命令来加载和卸载数据。BigQuery 还提供了多种方法来实现此行为,例如 bq load、BigQuery Data Transfer Service、bq extract 等等。本部分重点介绍了这些方法在数据加载和卸载方面的用法差异。
账号和会话 DDL
Snowflake 中的账号和会话概念在 BigQuery 中不受支持。BigQuery 允许通过 Cloud IAM 在所有级层管理账号。此外,BigQuery 尚不支持多语句事务。
用户定义的函数 (UDF)
借助 UDF,您可以为自定义操作创建函数。这些函数接受输入列、执行操作,然后以值的形式返回这些操作的结果。
Snowflake 和 BigQuery 均支持使用 SQL 表达式和 JavaScript 代码编写的 UDF。
如需了解常见 BigQuery UDF 库,请参阅 GoogleCloudPlatform/bigquery-utils/ GitHub 代码库。
CREATE FUNCTION
语法
下表介绍了 Snowflake 和 BigQuery 在 SQL UDF 创建语法方面的差异。
Snowflake | BigQuery |
---|---|
|
注意:在 BigQuery SQL UDF 中,返回数据类型是可选的。当查询调用函数时,BigQuery 会通过 SQL 函数正文推断出函数的结果类型。 |
|
注意:在 BigQuery SQL UDF 中,目前不支持返回表类型,但我们已在产品路线图中规划此功能并且很快就会推出。不过,BigQuery 支持返回 STRUCT 类型的 ARRAY。 |
注意:Snowflake 提供了安全的方法来将 UDF 定义和详细信息设为仅限授权用户(即被授予视图所有者角色的用户)访问。 |
注意:在 BigQuery 中,函数安全性不是可配置参数。BigQuery 支持创建 IAM 角色和权限,以限制对底层数据和函数定义的访问。 |
|
注意:null 输入的函数行为会在 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
注意:null 输入的过程行为会在 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 将在 4 小时空闲时间后回滚分离的事务。如果发生死锁,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 |