Impala和Hive之间的SQL差异

Impala和Hive之间的SQL差异
Impala的SQL语法遵循SQL-92标准,并且在内置功能等领域包括许多行业扩展。有关将SQL代码从各种数据库系统移植到Impala的一般讨论,请参见将SQL从其他数据库系统移植到Impala。

由于Impala和Hive共享相同的metastore数据库,并且它们的表经常互换使用,因此以下部分详细介绍了Impala和Hive之间的区别。

HiveQL功能在Impala中不可用
当前版本的Impala不支持您可能从HiveQL熟悉的以下SQL功能:

扩展机制,例如TRANSFORM,自定义文件格式或自定义SerDes。
该DATE数据类型。
XML函数。
从HiveQL某些集合函数:covar_pop,covar_samp, corr,percentile,percentile_approx, histogram_numeric,collect_set; Impala支持Impala集合函数中列出的集合函数集和Impala解析函数中列出的分析函数。
采样。
横向视图。在帕拉2.3和更高,帕拉支持在查询上复杂类型(STRUCT,ARRAY,或MAP),使用连接符号而不是EXPLODE()关键字。有关Impala对复杂类型的支持的详细信息,请参见复杂类型(仅Impala 2.3或更高版本)。
从Impala 1.2开始支持用户定义的函数(UDF)。有关 Impala UDF的完整详细信息,请参见用户定义函数(UDF)。
Impala支持用C ++编写的高性能UDF,以及重用某些基于Java的Hive UDF。

Impala支持标量UDF和用户定义的聚合函数(UDAF)。Impala当前不支持用户定义的表生成功能(UDTF)。

基于Java的UDF中仅支持Impala支持的列类型。

current_user()无法通过Impala从Java UDF调用 Hive 函数。

Impala当前不支持以下HiveQL语句:

ANALYZE TABLE(等效于Impala COMPUTE STATS)
DESCRIBE COLUMN
DESCRIBE DATABASE
EXPORT TABLE
IMPORT TABLE
SHOW TABLE EXTENDED
SHOW TBLPROPERTIES
SHOW INDEXES
SHOW COLUMNS
INSERT OVERWRITE DIRECTORY; 使用查询 或将查询结果具体化到与Impala表关联的HDFS目录中。 INSERT OVERWRITE table_nameCREATE TABLE AS SELECT
Impala serialization.null.format仅对TEXT表尊重table属性,而对Parquet和其他格式忽略该属性。Hive尊重serialization.null.format Parquet和其他格式的属性,并在扫描期间将匹配值转换为NULL。有关在Impala中使用table属性的信息,请参阅将文本数据文件与Impala表一起使用。

Impala和HiveQL功能之间的语义差异
本节介绍Impala和Hive具有相似功能(有时包括相同语法)的实例,但是这些功能的运行时语义有所不同。

安全:

Impala利用Apache Sentry授权框架,该框架提供了基于角色的细粒度访问控制,以防止未经授权的访问或篡改数据。

Hive的组件现在包括哨兵启用GRANT, REVOKE和CREATE/DROP ROLE语句。较早的Hive版本具有的特权系统GRANT和REVOKE语句,其主要目的是防止数据的意外删除,而不是一种防止恶意用户使用的安全机制。

Impala可以利用通过Hive GRANT和REVOKE语句设置的特权。Impala 在Impala 2.0及更高版本中具有自己的GRANT和REVOKE语句。有关Impala中授权的详细信息,请参阅Impala授权,包括如何使用metastore数据库中存储的特权从基于策略文件的原始特权模型切换到Sentry服务。

SQL语句和子句:

在某些情况下,Impala SQL语句的语义与HiveQL有所不同,它们使用类似的SQL语句和子句名称:

因帕拉使用不同的语法和查询提示名称,[SHUFFLE]而 [NOSHUFFLE]不是MapJoin或StreamJoin。有关Impala的详细信息,请参见 在Impala SELECT语句中加入。
因帕拉不公开的MapReduce的特定功能SORT BY,DISTRIBUTE BY或CLUSTER BY。
Impala不需要查询就包含FROM子句。
资料类型:

Impala支持一组有限的隐式强制转换。这可以帮助避免意外铸造行为产生的不良结果。
Impala不会在字符串和数字或布尔类型之间隐式转换。始终使用 CAST()这些转换。
当从较小或不太精确的类型转换为较大或更精确的类型时,Impala确实会在数字类型之间执行隐式强制转换。例如,黑斑羚将隐式转换 SMALLINT到BIGINT或FLOAT从,但转换 DOUBLE到FLOAT或INT以TINYINT 要求呼叫CAST()查询。
Impala确实执行从字符串到时间戳的隐式强制转换。Impala对于TIMESTAMP数据类型和from_unixtime()格式字符串具有一组有限的文字格式;有关详细信息,请参见TIMESTAMP数据类型。
有关所有类型的隐式和显式强制转换的完整详细信息,请参见数据类型;有关函数的详细信息,请参见Impala类型转换CAST()函数。

Impala不会使用本地时区来存储或解释时间戳,以避免意外的时区问题导致不希望的结果。时间戳相对于UTC进行存储和解释。对于Impala和Hive之间对类似名称的日期/时间函数的某些调用,此差异可能产生不同的结果。有关Impala函数的详细信息,请参见Impala日期和时间函数。请参阅TIMESTAMP数据类型,以获取有关Impala如何处理时区的讨论,以及在处理Parquet编码TIMESTAMP数据或在本地时区与UTC之间进行转换时,可用于使Impala与Hive行为更紧密匹配的配置选项。
Impala TIMESTAMP类型可以表示从1400-01-01到9999-12-31的日期。这与Hive日期范围(0000-01-01至9999-12-31)不同。
Impala不会将列溢出返回为NULL,因此客户可以像在NULL传统数据库系统中那样区分数据和溢出条件。Impala返回类型范围内的最大值或最小值。例如,有效值的 tinyint范围是-128到127。在Impala中,tinyint 值为-200的a返回-128而不是NULL。tinyint值为200的A 返回127。

其他功能:

Impala不提供虚拟列。
Impala不公开锁定。
Impala不公开某些配置属性。

你可能感兴趣的:(impala)