Apache Hive SQL 转换指南

本文档详细介绍了 Apache Hive 与 BigQuery 在 SQL 语法方面的异同,以帮助您规划迁移。如需批量迁移 SQL 脚本,请使用批量 SQL 转换。如需转换临时查询,请使用交互式 SQL 转换

在某些情况下,Hive 与 BigQuery 中的 SQL 元素之间不存在直接对应关系。但是,在大多数情况下,BigQuery 提供了 Hive 的替代元素来帮助您实现相同的功能,如本文档中的示例所示。

本文档的目标受众是企业架构师、数据库管理员、应用开发者和 IT 安全专家。本文假定您熟悉 Hive。

数据类型

Hive 和 BigQuery 具有不同的数据类型系统。在大多数情况下,您可以将 Hive 中的数据类型与 BigQuery 数据类型相对应,但存在一些例外情况,例如 MAPUNION。与 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
子查询

SELECT * FROM (
SELECT 10 as col1, "test" as col2, "test" as col3
) tmp_table;

SELECT * FROM (
SELECT 10 as col1, "test" as col2, "test" as col3
);

列过滤

SET hive.support.quoted.identifiers=none;
SELECT `(col2|col3)?+.+` FROM (
SELECT 10 as col1, "test" as col2, "test" as col3
) tmp_table;

SELECT * EXCEPT(col2,col3) FROM (
SELECT 10 as col1, "test" as col2, "test" as col3
);

分解数组

SELECT tmp_table.pageid, adid FROM (
SELECT 'test_value' pageid, Array(1,2,3) ad_id) tmp_table
LATERAL VIEW
explode(tmp_table.ad_id) adTable AS adid;

SELECT tmp_table.pageid, ad_id FROM (
SELECT 'test_value' pageid, [1,2,3] ad_id) tmp_table,
UNNEST(tmp_table.ad_id) ad_id;

FROM 子句

查询中的 FROM 子句会列出要从中选择数据的表引用。在 Hive 中,可能的表引用包括表、视图和子查询。BigQuery 也支持所有这些表引用。

您可以使用以下方法在 FROM 子句中引用 BigQuery 表:

  • [project_id].[dataset_id].[table_name]
  • [dataset_id].[table_name]
  • [table_name]

BigQuery 还支持其他表引用

比较运算符

下表详细介绍了如何将运算符从 Hive 转换为 BigQuery:

函数或运算符 Hive BigQuery
- 一元取反
* 乘法
/ 除法
+ 加法
- 减法
所有数字类型 所有数字类型

为防止在除法运算期间发生错误,请考虑使用 SAFE_DIVIDEIEEE_DIVIDE

~ 按位非
| 按位或
& 按位与
^ 按位异或
布尔值数据类型 布尔值数据类型。
向左移位

shiftleft(TINYINT|SMALLINT|INT a, INT b)
shiftleft(BIGINT a, INT b)

<< 整数或字节

A << B,其中 B 必须与 A 的类型相同

向右移位

shiftright(TINYINT|SMALLINT|INT a, INT b)
shiftright(BIGINT a, INT b)

>> 整数或字节

A >> B,其中 B 必须与 A 的类型相同

取模(余数) X % Y

所有数字类型

MOD(X, Y)
整数除法 A DIV BA/B(针对详细的精确率) 所有数字类型

注意:为防止在除法运算期间发生错误,请考虑使用 SAFE_DIVIDEIEEE_DIVIDE

一元否定 !NOT NOT
支持相等性比较的类型 所有原初类型 所有可比较的类型和 STRUCT
a <=> b 不支持。 转换为以下运算:

(a = b AND b IS NOT NULL OR a IS NULL)

a <> b 不支持。 转换为以下运算:

NOT (a = b AND b IS NOT NULL OR a IS NULL)

关系运算符 ( =, ==, !=, <, >, >= ) 所有原初类型 所有可比较的类型
字符串比较 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 联接

类型转换

下表详细介绍了如何将函数从 Hive 转换为 BigQuery:

函数或运算符 Hive BigQuery
类型转换 如果类型转换失败,则系统会返回“NULL”。

与 Hive 的语法相同。如需详细了解 BigQuery 类型转换规则,请参阅转换规则

如果类型转换失败,您会看到错误。如需与 Hive 具有相同的行为,请改用 SAFE_CAST

SAFE 函数调用 如果在函数调用前添加 SAFE 前缀,则函数会返回 NULL,而不是报告失败。例如,SAFE.SUBSTR('foo', 0, -2) AS safe_output; 会返回 NULL

注意:如果进行安全类型转换且没有错误,请使用 SAFE_CAST

隐式转换类型

迁移到 BigQuery 时,您需要将大多数 Hive 隐式转换转换为 BigQuery 显式转换,但 BigQuery 隐式转换的以下数据类型除外。

从 BigQuery 类型 到 BigQuery 类型
INT64 FLOAT64NUMERICBIGNUMERIC
BIGNUMERIC FLOAT64
NUMERIC BIGNUMERICFLOAT64

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) 函数DATETIMESTAMP 转换函数之一

函数

本部分介绍了 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(

IF(dep_var_expr is NULL

OR ind_var_expr is NULL,

NULL, ind_var_expr)

)

REGR_AVGY AVG(

IF(dep_var_expr is NULL

OR ind_var_expr is NULL,

NULL, dep_var_expr)

)

REGR_COUNT SUM(

IF(dep_var_expr is NULL

OR ind_var_expr is NULL,

NULL, 1)

)

REGR_INTERCEPT AVG(dep_var_expr)

- AVG(ind_var_expr)

* (COVAR_SAMP(ind_var_expr,dep_var_expr)

/ VARIANCE(ind_var_expr)

)

REGR_R2 (COUNT(dep_var_expr) *

SUM(ind_var_expr * dep_var_expr) -

SUM(dep_var_expr) * SUM(ind_var_expr))

/ SQRT(

(COUNT(ind_var_expr) *

SUM(POWER(ind_var_expr, 2)) *

POWER(SUM(ind_var_expr),2)) *

(COUNT(dep_var_expr) *

SUM(POWER(dep_var_expr, 2)) *

POWER(SUM(dep_var_expr), 2)))

REGR_SLOPE COVAR_SAMP(ind_var_expr,

dep_var_expr)

/ VARIANCE(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(

date_expression, INTERVAL 1 MONTH

), MONTH ), INTERVAL 1 DAY)

MONTHS_BETWEEN DATE_DIFF(date_expression, date_expression, MONTH)
NEXT_DAY DATE_ADD(

DATE_TRUNC(

date_expression,

WEEK(day_value)

),

INTERVAL 1 WEEK

)

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 语句中省略列名称。

INSERT OVERWRITE [LOCAL] DIRECTORY directory1

[ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)

SELECT ... FROM ...

BigQuery 不支持插入覆盖操作。此 Hive 语法可以迁移到 TRUNCATEINSERT 语句。

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

SET column = expression [,...]

[FROM ...]

WHERE TRUE

注意:BigQuery 中的所有 UPDATE 语句都需要 WHERE 关键字,后跟一个条件。

DELETETRUNCATE 语句

您可以使用 DELETETRUNCATE 语句从表中移除行,而不会影响表架构或索引。

在 BigQuery 中,DELETE 语句必须具有 WHERE 子句。 如需详细了解 BigQuery 中的 DELETE,请参阅 DELETE 示例

Hive BigQuery
DELETE FROM tablename [WHERE expression] DELETE FROM table_name WHERE TRUE

BigQuery DELETE 语句需要 WHERE 子句。

TRUNCATE [TABLE] table_name [PARTITION partition_spec]; TRUNCATE TABLE [[project_name.]dataset_name.]table_name

MERGE 语句

MERGE 语句可以将 INSERTUPDATEDELETE 操作合并为一个 upsert 语句并执行这些操作。对应每个目标行,MERGE 操作最多只能匹配一个源行。

Hive BigQuery
MERGE INTO AS T USING AS S ON

WHEN MATCHED [AND ] THEN UPDATE SET

WHEN MATCHED [AND ] THEN DELETE

WHEN NOT MATCHED [AND ] THEN INSERT VALUES

MERGE target USING source

ON target.key = source.key

WHEN MATCHED AND source.filter = 'filter_exp' THEN

UPDATE SET

target.col1 = source.col1,

target.col2 = source.col2,

...

注意:您必须列出需要更新的所有列。

ALTER 语句

下表详细介绍了如何将 CREATE VIEW 语句从 Hive 转换为 BigQuery:

功能 Hive BigQuery
Rename table ALTER TABLE table_name RENAME TO new_table_name; 不支持。 解决方法是使用您希望其名称作为目标表名称的复制作业,然后删除旧复制作业。

bq copy project.dataset.old_table project.dataset.new_table

bq rm --table project.dataset.old_table

Table properties ALTER TABLE table_name SET TBLPROPERTIES table_properties;

table_properties:

: (property_name = property_value, property_name = property_value, ... )

Table Comment: ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);

{ALTER TABLE | ALTER TABLE IF EXISTS}

table_name

SET OPTIONS(table_set_options_list)

SerDe properties (Serialize and deserialize) ALTER TABLE table_name [PARTITION partition_spec] SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];

ALTER TABLE table_name [PARTITION partition_spec] SET SERDEPROPERTIES serde_properties;

serde_properties:

: (property_name = property_value, property_name = property_value, ... )

序列化和反序列化由 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), ...]

[STORED AS DIRECTORIES];

Not Skewed: ALTER TABLE table_name NOT SKEWED;

Not Stored as Directories: ALTER TABLE table_name NOT STORED AS DIRECTORIES;

Skewed Location: ALTER TABLE table_name SET SKEWED LOCATION (col_name1="location1" [, col_name2="location2", ...] );

用于性能查询的均衡存储由 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 table_name DROP CONSTRAINT constraint_name;

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;

如需了解详情,请参阅 ALTER TABLE ADD PRIMARY KEY 语句

Add partition ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];

partition_spec:

: (partition_column = partition_col_value, partition_column = partition_col_value, ...)

不支持。 加载分区列中具有新值的数据时,您可以根据需要添加其他分区。

如需了解详情,请参阅管理分区表

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

ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_1; -- multiple partitions

ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec, partition_spec2, ...) WITH TABLE table_name_1;

不受支持。
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]; 使用以下方法支持此语句:
  • bq rm 'mydataset.table_name$partition_id'
  • DELETE from table_name$partition_id WHERE 1=1

  • 如需了解详情,请参阅删除分区

(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];

ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE OFFLINE;

不受支持。
Table and partition compact ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] COMPACT 'compaction_type'[AND WAIT]

[WITH OVERWRITE TBLPROPERTIES ("property"="value" [, ...])];

不受支持。
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 TABLEDROP TABLE 语句

下表详细介绍了如何将 CREATE TABLE 语句从 Hive 转换为 BigQuery:

类型 Hive BigQuery
代管式表 create table table_name (

id int,

dtDontQuery string,

name string

)

CREATE TABLE `myproject`.mydataset.table_name (

id INT64,

dtDontQuery STRING,

name STRING

)

分区表 create table table_name (

id int,

dt string,

name string

)

partitioned by (date string)

CREATE TABLE `myproject`.mydataset.table_name (

id INT64,

dt DATE,

name STRING

)

PARTITION BY dt

OPTIONS(

partition_expiration_days=3,

description="a table partitioned by date_col"

)

Create table as select (CTAS) CREATE TABLE new_key_value_store

ROW FORMAT SERDE "org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe"

STORED AS RCFile

AS

SELECT (key % 1024) new_key, concat(key, value) key_value_pair, dt

FROM key_value_store

SORT BY new_key, key_value_pair;

CREATE TABLE `myproject`.mydataset.new_key_value_store

按日期分区时,请取消备注以下内容:

PARTITION BY dt

OPTIONS(

description="Table Description",

按日期分区时,请取消备注以下内容。对表进行分区时,建议使用 require_partition

require_partition_filter=TRUE

) AS

SELECT (key % 1024) new_key, concat(key, value) key_value_pair, dt

FROM key_value_store

SORT BY new_key, key_value_pair'

Create Table Like:

通过 CREATE TABLELIKE 形式,您可以准确复制现有的表定义。

CREATE TABLE empty_key_value_store

LIKE key_value_store [TBLPROPERTIES (property_name=property_value, ...)];

不受支持。
分桶排序表(按 BigQuery 术语进行聚簇) CREATE TABLE page_view(

viewTime INT,

userid BIGINT,

page_url STRING,

referrer_url STRING,

ip STRING COMMENT 'IP Address of the User'

)

COMMENT 'This is the page view table'

PARTITIONED BY(dt STRING, country STRING)

CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\001'

COLLECTION ITEMS TERMINATED BY '\002'

MAP KEYS TERMINATED BY '\003'

STORED AS SEQUENCEFILE;

CREATE TABLE `myproject` mydataset.page_view (

viewTime INT,

dt DATE,

userId BIGINT,

page_url STRING,

referrer_url STRING,

ip STRING OPTIONS (description="IP Address of the User")

)

PARTITION BY dt

CLUSTER BY userId

OPTIONS (

partition_expiration_days=3,

description="This is the page view table",

require_partition_filter=TRUE

)'

如需了解详情,请参阅创建和使用聚簇表

偏差表(一个或多个列有偏差值的表) CREATE TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING)

SKEWED BY (col1, col2) ON (('s1',1), ('s3',3), ('s13',13), ('s78',78)) [STORED AS DIRECTORIES];

不受支持。
临时表 CREATE TEMPORARY TABLE list_bucket_multiple (

col1 STRING,

col2 int,

col3 STRING);

您可以使用到期时间来实现这一点,如下所示:

CREATE TABLE mydataset.newtable

(

col1 STRING OPTIONS(description="An optional INTEGER field"),

col2 INT64,

col3 STRING

)

PARTITION BY DATE(_PARTITIONTIME)

OPTIONS(

expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC",

partition_expiration_days=1,

description="a table that expires in 2020, with each partition living for 24 hours",

labels=[("org_unit", "development")]

)

事务表 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}

table_name

截断表 TRUNCATE TABLE table_name [PARTITION partition_spec];

partition_spec:

: (partition_column = partition_col_value, partition_column = partition_col_value, ...)

不支持。 您可以使用以下解决方法:

  • 丢弃并重新创建具有相同架构的表。
  • 如果截断操作是给定表的常见应用场景,则将表的写入处置方式设置为 WRITE_TRUNCATE
  • 使用 CREATE OR REPLACE TABLE 语句。
  • 使用 DELETE from table_name WHERE 1=1 语句。

注意:您也可以截断特定分区。如需了解详情,请参阅删除分区

CREATE EXTERNAL TABLEDROP EXTERNAL TABLE 语句

如需了解 BigQuery 中的外部表支持,请参阅外部数据源简介

CREATE VIEWDROP VIEW 语句

下表详细介绍了如何将 CREATE VIEW 语句从 Hive 转换为 BigQuery:

Hive BigQuery
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]

[COMMENT view_comment]

[TBLPROPERTIES (property_name = property_value, ...)]

AS SELECT ...;

{CREATE VIEW | CREATE VIEW IF NOT EXISTS | CREATE OR REPLACE VIEW}

view_name

[OPTIONS(view_option_list)]

AS query_expression

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]materialized_view_name

[DISABLE REWRITE]

[COMMENT materialized_view_comment]

[PARTITIONED ON (col_name, ...)]

[

[ROW FORMAT row_format]

[STORED AS file_format]

| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]

]

[LOCATION hdfs_path]

[TBLPROPERTIES (property_name=property_value, ...)]

AS

;

CREATE MATERIALIZED VIEW [IF NOT EXISTS] \ [project_id].[dataset_id].materialized_view_name

-- cannot disable rewrites in BigQuery

[OPTIONS(

[description="materialized_view_comment",] \ [other materialized_view_option_list]

)]

[PARTITION BY (col_name)] --same as source table

CREATE FUNCTIONDROP FUNCTION 语句

下表详细介绍了如何将存储过程从 Hive 转换为 BigQuery:

Hive BigQuery
CREATE TEMPORARY FUNCTION function_name AS class_name; CREATE { TEMPORARY | TEMP } FUNCTION function_name ([named_parameter[, ...]])

[RETURNS data_type]

AS (sql_expression)

named_parameter:

param_name param_type

DROP TEMPORARY FUNCTION [IF EXISTS] function_name; 不受支持。
CREATE FUNCTION [db_name.]function_name AS class_name

[USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];

作为 Alpha 版功能支持列入许可名单的项目。

CREATE { FUNCTION | FUNCTION IF NOT EXISTS | OR REPLACE FUNCTION }

function_name ([named_parameter[, ...]])

[RETURNS data_type]

AS (expression);

named_parameter:

param_name param_type

DROP FUNCTION [IF EXISTS] function_name; DROP FUNCTION [ IF EXISTS ] function_name
RELOAD FUNCTION; 不受支持。

CREATE MACRODROP 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 不支持多语句事务。不支持 BEGINCOMMITROLLBACK 语句。在 Hive 中,所有语言操作都会自动提交。

使用会话时,BigQuery 支持在单个查询或多个查询中执行多语句事务。通过多语句事务,您可以执行变更操作,例如在一个或多个表中插入或删除行,以及提交或回滚更改。如需了解详情,请参阅多语句事务