Apache Hive SQL 转换指南
本文档详细介绍了 Apache Hive 与 BigQuery 在 SQL 语法方面的异同,以帮助您规划迁移。如需批量迁移 SQL 脚本,请使用批量 SQL 转换。如需转换临时查询,请使用交互式 SQL 转换。
在某些情况下,Hive 与 BigQuery 中的 SQL 元素之间不存在直接对应关系。但是,在大多数情况下,BigQuery 提供了 Hive 的替代元素来帮助您实现相同的功能,如本文档中的示例所示。
本文档的目标受众是企业架构师、数据库管理员、应用开发者和 IT 安全专家。本文假定您熟悉 Hive。
数据类型
Hive 和 BigQuery 具有不同的数据类型系统。在大多数情况下,您可以将 Hive 中的数据类型与 BigQuery 数据类型相对应,但存在一些例外情况,例如 MAP
和 UNION
。与 BigQuery 相比,Hive 支持更多隐式类型转换。因此,批量 SQL 转换器会插入许多显式类型转换。
Hive | BigQuery |
---|---|
TINYINT |
INT64 |
SMALLINT |
INT64 |
INT |
INT64 |
BIGINT |
INT64 |
DECIMAL |
NUMERIC |
FLOAT |
FLOAT64 |
DOUBLE |
FLOAT64 |
BOOLEAN |
BOOL |
STRING |
STRING |
VARCHAR |
STRING |
CHAR |
STRING |
BINARY |
BYTES |
DATE |
DATE |
- | DATETIME |
- | TIME |
TIMESTAMP |
DATETIME/TIMESTAMP |
INTERVAL |
- |
ARRAY |
ARRAY |
STRUCT |
STRUCT |
MAPS |
STRUCT ,具有键值(REPEAT 字段) |
UNION |
STRUCT ,具有不同类型 |
- | GEOGRAPHY |
- | JSON |
查询语法
本部分介绍了 Hive 和 BigQuery 在查询语法方面的差异。
SELECT
语句
大多数 Hive SELECT
语句都与 BigQuery 兼容。下表列出了一些细微差异:
格 | Hive | BigQuery |
---|---|---|
子查询 |
|
|
列过滤 |
|
|
分解数组 |
|
|
FROM
子句
查询中的 FROM
子句会列出要从中选择数据的表引用。在 Hive 中,可能的表引用包括表、视图和子查询。BigQuery 也支持所有这些表引用。
您可以使用以下方法在 FROM
子句中引用 BigQuery 表:
[project_id].[dataset_id].[table_name]
[dataset_id].[table_name]
[table_name]
BigQuery 还支持其他表引用:
- 表定义的历史版本和使用
FOR SYSTEM_TIME AS OF
的行 - 字段路径,或解析为数据类型(例如
STRUCT
)中某字段的任何路径 - 展平数组
比较运算符
下表详细介绍了如何将运算符从 Hive 转换为 BigQuery:
函数或运算符 | Hive | BigQuery |
---|---|---|
- 一元取反 * 乘法 / 除法 + 加法 - 减法
|
所有数字类型 | 所有数字类型。 为防止在除法运算期间发生错误,请考虑使用 |
~ 按位非 | 按位或 & 按位与 ^ 按位异或
|
布尔值数据类型 | 布尔值数据类型。 |
向左移位 |
|
|
向右移位 |
|
|
取模(余数) |
X % Y 所有数字类型 |
MOD(X, Y) |
整数除法 | A DIV B 和 A/B (针对详细的精确率) |
所有数字类型。 注意:为防止在除法运算期间发生错误,请考虑使用 |
一元否定 | ! 、NOT |
NOT |
支持相等性比较的类型 | 所有原初类型 | 所有可比较的类型和 STRUCT 。
|
a <=> b |
不支持。 转换为以下运算:
|
|
a <> b |
不支持。 转换为以下运算:
|
|
关系运算符 ( =, ==, !=, <, >, >= ) |
所有原初类型 | 所有可比较的类型。 |
字符串比较 | RLIKE , REGEXP
|
REGEXP_CONTAINS 内置函数。将 BigQuery 字符串函数的正则表达式语法用于正则表达式模式。 |
[NOT] LIKE, [NOT] BETWEEN, IS [NOT] NULL |
A [NOT] BETWEEN B AND C, A IS [NOT] (TRUE|FALSE), A [NOT] LIKE B
|
与 Hive 相同。此外,BigQuery 还支持 IN 运算符。 |
JOIN 条件
Hive 和 BigQuery 都支持以下联接类型:
[INNER] JOIN
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
FULL [OUTER] JOIN
CROSS JOIN
和等效的隐式逗号交叉联接
类型转换
下表详细介绍了如何将函数从 Hive 转换为 BigQuery:
函数或运算符 | Hive | BigQuery |
---|---|---|
类型转换 | 如果类型转换失败,则系统会返回“NULL”。 | 与 Hive 的语法相同。如需详细了解 BigQuery 类型转换规则,请参阅转换规则。 如果类型转换失败,您会看到错误。如需与 Hive 具有相同的行为,请改用 |
SAFE 函数调用 |
如果在函数调用前添加 SAFE 前缀,则函数会返回 NULL ,而不是报告失败。例如,SAFE.SUBSTR('foo', 0, -2) AS safe_output; 会返回 NULL 。注意:如果进行安全类型转换且没有错误,请使用 |
隐式转换类型
迁移到 BigQuery 时,您需要将大多数 Hive 隐式转换转换为 BigQuery 显式转换,但 BigQuery 隐式转换的以下数据类型除外。
从 BigQuery 类型 | 到 BigQuery 类型 |
---|---|
INT64 |
FLOAT64 、NUMERIC 、BIGNUMERIC |
BIGNUMERIC |
FLOAT64 |
NUMERIC |
BIGNUMERIC 、FLOAT64 |
BigQuery 还会对以下字面量执行隐式转换:
从 BigQuery 类型 | 到 BigQuery 类型 |
---|---|
STRING 字面量(例如 "2008-12-25" ) |
DATE |
STRING 字面量(例如 "2008-12-25 15:30:00" ) |
TIMESTAMP |
STRING 字面量(例如 "2008-12-25T07:30:00" ) |
DATETIME |
STRING 字面量(例如 "15:30:00" ) |
TIME |
显式转换类型
如果您要转换 BigQuery 未隐式转换的 Hive 数据类型,请使用 BigQuery CAST(expression AS type)
函数或 DATE
和 TIMESTAMP
转换函数之一。
函数
本部分介绍了 Hive 和 BigQuery 中常用的函数。
聚合函数
下表展示了常见的 Hive 聚合、统计聚合和近似聚合函数与其 BigQuery 等效项之间的对应关系:
Hive | BigQuery |
---|---|
count(DISTINCT expr[, expr...])
|
count(DISTINCT expr[, expr...])
|
percentile_approx(DOUBLE col, array(p1 [, p2]...) [, B]) WITHIN GROUP (ORDER BY expression)
|
APPROX_QUANTILES(expression, 100)[OFFSET(CAST(TRUNC(percentile * 100) as INT64))] BigQuery 不支持 Hive 定义的其余参数。 |
AVG
|
AVG
|
X | Y
|
BIT_OR / X | Y
|
X ^ Y
|
BIT_XOR / X ^ Y
|
X & Y
|
BIT_AND / X & Y
|
COUNT
|
COUNT
|
COLLECT_SET(col), \
COLLECT_LIST(col )
|
ARRAY_AGG(col)
|
COUNT
|
COUNT
|
MAX
|
MAX
|
MIN
|
MIN
|
REGR_AVGX
|
AVG(
|
REGR_AVGY
|
AVG(
|
REGR_COUNT
|
SUM(
|
REGR_INTERCEPT
|
AVG(dep_var_expr)
|
REGR_R2
|
(COUNT(dep_var_expr) *
|
REGR_SLOPE
|
COVAR_SAMP(ind_var_expr,
|
REGR_SXX
|
SUM(POWER(ind_var_expr, 2)) - COUNT(ind_var_expr) * POWER(AVG(ind_var_expr),2)
|
REGR_SXY
|
SUM(ind_var_expr*dep_var_expr) - COUNT(ind_var_expr) * AVG(ind) * AVG(dep_var_expr)
|
REGR_SYY
|
SUM(POWER(dep_var_expr, 2)) - COUNT(dep_var_expr) * POWER(AVG(dep_var_expr),2)
|
ROLLUP
|
ROLLUP
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP, STDDEV
|
SUM
|
SUM
|
VAR_POP
|
VAR_POP
|
VAR_SAMP
|
VAR_SAMP, VARIANCE
|
CONCAT_WS
|
STRING_AGG
|
分析函数
下表展示了常见的 Hive 分析函数与其 BigQuery 等效项之间的对应关系:
Hive | BigQuery |
---|---|
AVG
|
AVG
|
COUNT
|
COUNT
|
COVAR_POP
|
COVAR_POP
|
COVAR_SAMP
|
COVAR_SAMP
|
CUME_DIST
|
CUME_DIST
|
DENSE_RANK
|
DENSE_RANK
|
FIRST_VALUE
|
FIRST_VALUE
|
LAST_VALUE
|
LAST_VALUE
|
LAG
|
LAG
|
LEAD
|
LEAD
|
COLLECT_LIST, \
COLLECT_SET
|
ARRAY_AGG
ARRAY_CONCAT_AGG
|
MAX
|
MAX
|
MIN
|
MIN
|
NTILE
|
NTILE(constant_integer_expression)
|
PERCENT_RANK
|
PERCENT_RANK
|
RANK ()
|
RANK
|
ROW_NUMBER
|
ROW_NUMBER
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP, STDDEV
|
SUM
|
SUM
|
VAR_POP
|
VAR_POP
|
VAR_SAMP
|
VAR_SAMP, VARIANCE
|
VARIANCE
|
VARIANCE ()
|
WIDTH_BUCKET
|
可以使用用户定义的函数 (UDF)。 |
日期和时间函数
下表展示了常见的 Hive 日期和时间函数与其 BigQuery 等效项之间的对应关系:
DATE_ADD
|
DATE_ADD(date_expression, INTERVAL int64_expression date_part)
|
DATE_SUB
|
DATE_SUB(date_expression, INTERVAL int64_expression date_part)
|
CURRENT_DATE
|
CURRENT_DATE
|
CURRENT_TIME
|
CURRENT_TIME
|
CURRENT_TIMESTAMP
|
建议为 CURRENT_DATETIME ,因为此值无时区,与 Hive 中的 CURRENT_TIMESTAMP \ CURRENT_TIMESTAMP 同义。
|
EXTRACT(field FROM source)
|
EXTRACT(part FROM datetime_expression)
|
LAST_DAY
|
DATE_SUB( DATE_TRUNC( DATE_ADD(
|
MONTHS_BETWEEN
|
DATE_DIFF(date_expression, date_expression, MONTH)
|
NEXT_DAY
|
DATE_ADD(
|
TO_DATE
|
PARSE_DATE
|
FROM_UNIXTIME
|
UNIX_SECONDS
|
FROM_UNIXTIMESTAMP
|
FORMAT_TIMESTAMP
|
YEAR \
QUARTER \
MONTH \
HOUR \
MINUTE \
SECOND \
WEEKOFYEAR
|
EXTRACT
|
DATEDIFF
|
DATE_DIFF
|
BigQuery 还提供以下其他日期和时间函数:
字符串函数
下表展示了 Hive 字符串函数与其 BigQuery 等效项之间的对应关系:
Hive | BigQuery |
---|---|
ASCII
|
TO_CODE_POINTS(string_expr)[OFFSET(0)]
|
HEX
|
TO_HEX
|
LENGTH
|
CHAR_LENGTH
|
LENGTH
|
CHARACTER_LENGTH
|
CHR
|
CODE_POINTS_TO_STRING
|
CONCAT
|
CONCAT
|
LOWER
|
LOWER
|
LPAD
|
LPAD
|
LTRIM
|
LTRIM
|
REGEXP_EXTRACT
|
REGEXP_EXTRACT
|
REGEXP_REPLACE
|
REGEXP_REPLACE
|
REPLACE
|
REPLACE
|
REVERSE
|
REVERSE
|
RPAD
|
RPAD
|
RTRIM
|
RTRIM
|
SOUNDEX
|
SOUNDEX
|
SPLIT
|
SPLIT(instring, delimiter)[ORDINAL(tokennum)]
|
SUBSTR, \
SUBSTRING
|
SUBSTR
|
TRANSLATE
|
TRANSLATE
|
LTRIM
|
LTRIM
|
RTRIM
|
RTRIM
|
TRIM
|
TRIM
|
UPPER
|
UPPER
|
BigQuery 还提供以下字符串函数:
数学函数
下表展示了 Hive 数学函数与其 BigQuery 等效项之间的对应关系:
Hive | BigQuery |
---|---|
ABS
|
ABS
|
ACOS
|
ACOS
|
ASIN
|
ASIN
|
ATAN
|
ATAN
|
CEIL
|
CEIL
|
CEILING
|
CEILING
|
COS
|
COS
|
FLOOR
|
FLOOR
|
GREATEST
|
GREATEST
|
LEAST
|
LEAST
|
LN
|
LN
|
LNNVL
|
与 ISNULL 配合使用。
|
LOG
|
LOG
|
MOD (% operator)
|
MOD
|
POWER
|
POWER, POW
|
RAND
|
RAND
|
ROUND
|
ROUND
|
SIGN
|
SIGN
|
SIN
|
SIN
|
SQRT
|
SQRT
|
HASH
|
FARM_FINGERPRINT, MD5, SHA1, SHA256, SHA512
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP
|
TAN
|
TAN
|
TRUNC
|
TRUNC
|
NVL
|
IFNULL(expr, 0), COALESCE(exp, 0)
|
BigQuery 还提供以下数学函数:
逻辑和条件函数
下表展示了 Hive 逻辑和条件函数与其 BigQuery 等效项之间的对应关系:
Hive | BigQuery |
---|---|
CASE
|
CASE
|
COALESCE
|
COALESCE
|
NVL
|
IFNULL(expr, 0), COALESCE(exp, 0)
|
NULLIF
|
NULLIF
|
IF
|
IF(expr, true_result, else_result)
|
ISNULL
|
IS NULL
|
ISNOTNULL
|
IS NOT NULL
|
NULLIF
|
NULLIF
|
UDF 和 UDAF
BigQuery 支持 UDF,但不支持用户定义的聚合函数 (UDAF)。
DML 语法
本部分介绍了 Hive 和 BigQuery 在数据操纵语言 (DML) 语法方面的差异。
INSERT
语句
大多数 Hive INSERT
语句都与 BigQuery 兼容。下表展示了例外情况:
Hive | BigQuery |
---|---|
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]
|
INSERT INTO table (...) VALUES (...);
注意:在 BigQuery 中,只有目标表中所有列的值根据其顺序位置按升序添加时,才能在 |
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
|
BigQuery 不支持插入覆盖操作。此 Hive 语法可以迁移到 TRUNCATE 和 INSERT 语句。
|
BigQuery 设有 DML 配额,用于限制您每天可以执行的 DML 语句的数量。为了充分利用您的配额,请考虑采用以下方法:
将多行合并在一个
INSERT
语句中,而不是每个INSERT
操作占一行。使用
MERGE
语句合并多个 DML 语句(包括INSERT
)。使用
CREATE TABLE ... AS SELECT
创建并填充新表。
UPDATE
语句
大多数 Hive UPDATE
语句都与 BigQuery 兼容。下表展示了例外情况:
Hive | BigQuery |
---|---|
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
|
UPDATE table
注意:BigQuery 中的所有 |
DELETE
和 TRUNCATE
语句
您可以使用 DELETE
或 TRUNCATE
语句从表中移除行,而不会影响表架构或索引。
在 BigQuery 中,DELETE
语句必须具有 WHERE
子句。
如需详细了解 BigQuery 中的 DELETE
,请参阅 DELETE
示例。
Hive | BigQuery |
---|---|
DELETE FROM tablename [WHERE expression]
|
DELETE FROM table_name
WHERE TRUE
BigQuery |
TRUNCATE [TABLE] table_name [PARTITION partition_spec];
|
TRUNCATE TABLE [[project_name.]dataset_name.]table_name
|
MERGE
语句
MERGE
语句可以将 INSERT
、UPDATE
和 DELETE
操作合并为一个 upsert 语句并执行这些操作。对应每个目标行,MERGE
操作最多只能匹配一个源行。
Hive | BigQuery |
---|---|
MERGE INTO
ON
|
MERGE target
USING source
注意:您必须列出需要更新的所有列。 |
ALTER
语句
下表详细介绍了如何将 CREATE VIEW
语句从 Hive 转换为 BigQuery:
功能 | Hive | BigQuery |
---|---|---|
Rename table
|
ALTER TABLE table_name RENAME TO new_table_name;
|
不支持。 解决方法是使用您希望其名称作为目标表名称的复制作业,然后删除旧复制作业。
|
Table properties
|
ALTER TABLE table_name SET TBLPROPERTIES table_properties;
|
{ALTER TABLE | ALTER TABLE IF EXISTS}
|
SerDe properties (Serialize and deserialize)
|
ALTER TABLE table_name [PARTITION partition_spec] SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];
|
序列化和反序列化由 BigQuery 服务管理,用户无法配置。
如需了解如何让 BigQuery 从 CSV、JSON、AVRO、PARQUET 或 ORC 文件读取数据,请参阅创建 Cloud Storage 外部表。 支持 CSV、JSON、AVRO 和 PARQUET 导出格式。如需了解详情,请参阅导出格式和压缩类型。 |
Table storage properties
|
ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name, ...)]
INTO num_buckets BUCKETS;
|
不支持 ALTER 语句。
|
Skewed table
|
Skewed:
ALTER TABLE table_name SKEWED BY (col_name1, col_name2, ...)
ON ([(col_name1_value, col_name2_value, ...) [, (col_name1_value, col_name2_value), ...]
|
用于性能查询的均衡存储由 BigQuery 服务管理,无法进行配置。 |
Table constraints
|
ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (column, ...) DISABLE NOVALIDATE;
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column, ...) REFERENCES table_name(column, ...) DISABLE NOVALIDATE RELY;
|
ALTER TABLE [[project_name.]dataset_name.]table_name ADD [CONSTRAINT [IF NOT EXISTS] [constraint_name]] constraint NOT ENFORCED; ALTER TABLE [[project_name.]dataset_name.]table_name ADD PRIMARY KEY(column_list) NOT ENFORCED;
如需了解详情,请参阅 |
Add partition
|
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];
|
不支持。 加载分区列中具有新值的数据时,您可以根据需要添加其他分区。 如需了解详情,请参阅管理分区表。 |
Rename partition
|
ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;
|
不受支持。 |
Exchange partition
|
-- Move partition from table_name_1 to table_name_2
|
不受支持。 |
Recover partition
|
MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];
|
不受支持。 |
Drop partition
|
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...]
[IGNORE PROTECTION] [PURGE];
|
使用以下方法支持此语句:
如需了解详情,请参阅删除分区。 |
(Un)Archive partition
|
ALTER TABLE table_name ARCHIVE PARTITION partition_spec;
ALTER TABLE table_name UNARCHIVE PARTITION partition_spec;
|
不受支持。 |
Table and partition file format
|
ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format;
|
不受支持。 |
Table and partition location
|
ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location";
|
不受支持。 |
Table and partition touch
|
ALTER TABLE table_name TOUCH [PARTITION partition_spec];
|
不受支持。 |
Table and partition protection
|
ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE NO_DROP [CASCADE];
|
不受支持。 |
Table and partition compact
|
ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])]
COMPACT 'compaction_type'[AND WAIT]
|
不受支持。 |
Table and artition concatenate
|
ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] CONCATENATE;
|
不受支持。 |
Table and partition columns
|
ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] UPDATE COLUMNS;
|
不支持 ALTER TABLE 语句。
|
Column name, type, position, and comment
|
ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type
[COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];
|
不受支持。 |
DDL 语法
本部分介绍了 Hive 和 BigQuery 在数据定义语言 (DDL) 语法方面的差异。
CREATE TABLE
和 DROP TABLE
语句
下表详细介绍了如何将 CREATE TABLE
语句从 Hive 转换为 BigQuery:
类型 | Hive | BigQuery |
---|---|---|
代管式表 | create table table_name (
|
CREATE TABLE `myproject`.mydataset.table_name (
|
分区表 | create table table_name (
|
CREATE TABLE `myproject`.mydataset.table_name (
|
Create table as select (CTAS)
|
CREATE TABLE new_key_value_store
|
CREATE TABLE `myproject`.mydataset.new_key_value_store
按日期分区时,请取消备注以下内容:
按日期分区时,请取消备注以下内容。对表进行分区时,建议使用
|
Create Table Like:
通过 |
CREATE TABLE empty_key_value_store
|
不受支持。 |
分桶排序表(按 BigQuery 术语进行聚簇) | CREATE TABLE page_view(
|
CREATE TABLE `myproject` mydataset.page_view (
如需了解详情,请参阅创建和使用聚簇表。 |
偏差表(一个或多个列有偏差值的表) | CREATE TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING)
|
不受支持。 |
临时表 | CREATE TEMPORARY TABLE list_bucket_multiple (
|
您可以使用到期时间来实现这一点,如下所示:
|
事务表 | CREATE TRANSACTIONAL TABLE transactional_table_test(key string, value string) PARTITIONED BY(ds string) STORED AS ORC;
|
BigQuery 中的所有表修改均符合 ACID(原子性、一致性、隔离性、持久性)。 |
舍弃表 | DROP TABLE [IF EXISTS] table_name [PURGE];
|
{DROP TABLE | DROP TABLE IF EXISTS}
|
截断表 | TRUNCATE TABLE table_name [PARTITION partition_spec];
|
不支持。 您可以使用以下解决方法:
注意:您也可以截断特定分区。如需了解详情,请参阅删除分区。 |
CREATE EXTERNAL TABLE
和 DROP EXTERNAL TABLE
语句
如需了解 BigQuery 中的外部表支持,请参阅外部数据源简介。
CREATE VIEW
和 DROP VIEW
语句
下表详细介绍了如何将 CREATE VIEW
语句从 Hive 转换为 BigQuery:
Hive | BigQuery |
---|---|
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
|
{CREATE VIEW | CREATE VIEW IF NOT EXISTS | CREATE OR REPLACE VIEW}
|
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]materialized_view_name
|
CREATE MATERIALIZED VIEW [IF NOT EXISTS] \
[project_id].[dataset_id].materialized_view_name
|
CREATE FUNCTION
和 DROP FUNCTION
语句
下表详细介绍了如何将存储过程从 Hive 转换为 BigQuery:
Hive | BigQuery |
---|---|
CREATE TEMPORARY FUNCTION function_name AS class_name;
|
CREATE { TEMPORARY | TEMP } FUNCTION function_name ([named_parameter[, ...]])
|
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;
|
不受支持。 |
CREATE FUNCTION [db_name.]function_name AS class_name
|
作为 Alpha 版功能支持列入许可名单的项目。
|
DROP FUNCTION [IF EXISTS] function_name;
|
DROP FUNCTION [ IF EXISTS ] function_name
|
RELOAD FUNCTION;
|
不受支持。 |
CREATE MACRO
和 DROP MACRO
语句
下表详细介绍了如何使用变量声明和赋值将创建宏时使用的过程 SQL 语句从 Hive 转换为 BigQuery:
Hive | BigQuery |
---|---|
CREATE TEMPORARY MACRO macro_name([col_name col_type, ...]) expression;
|
不支持。 在某些情况下,可以使用 UDF 替换该语句。 |
DROP TEMPORARY MACRO [IF EXISTS] macro_name;
|
不受支持。 |
错误代码和消息
Hive 错误代码与 BigQuery 错误代码有所不同。如果您的应用逻辑捕获错误,请消除错误的来源,因为 BigQuery 不会返回相同的错误代码。
在 BigQuery 中,通常使用 INFORMATION_SCHEMA 视图或审核日志记录来检查错误。
一致性保证和事务隔离
Hive 和 BigQuery 都支持具有 ACID 语义的事务。在 Hive 3 中,事务默认处于启用状态。
ACID 语义
Hive 支持快照隔离。执行查询时,系统会为查询提供一致的数据库快照,查询在执行结束之前会一直使用该快照。Hive 在行级提供完整 ACID 语义,可让一个应用在另一个应用从同一分区读取数据时添加行,而不会相互干扰。
BigQuery 使用快照隔离提供乐观并发控制(首先提交胜出),通过该控制查询会在查询开始之前读取最后提交的数据。此方法可保证每行和每个变更和同一 DML 语句中的各行具有相同的一致性级别,同时避免死锁。如果对同一个表进行了多次 DML 更新,BigQuery 会切换到悲观并发控制。加载作业可以独立运行并附加表;但是,BigQuery 不提供明确的事务边界或会话。
事务
Hive 不支持多语句事务。不支持 BEGIN
、COMMIT
和 ROLLBACK
语句。在 Hive 中,所有语言操作都会自动提交。
使用会话时,BigQuery 支持在单个查询或多个查询中执行多语句事务。通过多语句事务,您可以执行变更操作,例如在一个或多个表中插入或删除行,以及提交或回滚更改。如需了解详情,请参阅多语句事务。