Impala 和 Hive 之间的SQL 差异

基于impala 3.2版本:

概述:

impala 遵循SQL-92标准,但是在内置函数上有了不少自己的扩展。

由于impala和hive共享相同的metastore数据库,并且它们的表经常互换使用。

impala 不支持的Hive的功能

1.函数:
covar_pop, covar_samp, corr, percentile, percentile_approx, histogram_numeric, collect_set

XML 函数

2.数据类型:
DATE 类型和binary类型

3.扩展机制,例如TRANSFORM,自定义文件格式或自定义SerDes。

4.采样(Sampling)

5.Lateral views 以及EXPLODE() 关键字

6. Hive 语句:
ANALYZE TABLE (the Impala equivalent is COMPUTE STATS)
DESCRIBE COLUMN
DESCRIBE DATABASE
EXPORT TABLE
IMPORT TABLE
SHOW TABLE EXTENDED
SHOW TBLPROPERTIES
SHOW INDEXES
SHOW COLUMNS
INSERT OVERWRITE DIRECTORY (在impala中使用 INSERT OVERWRITE table_name or CREATE TABLE AS SELECT 存储数据在HDFS上)

7.UDF(自定义函数)
  1.Impala支持用C ++编写的高性能UDF,以及重用某些基于Java的Hive UDF
  2.Impala支持标量UDF和用户定义的聚合函数(UDAF)。Impala当前不支持用户定义的表生成功能(UDTF)
  3.基于Java的UDF中仅支持Impala支持的列类型
  4. current_user()无法通过Impala从Java UDF调用 Hive 函数。
8.serialization.null.format 的不同:
Impala 将 serialization.null.format 属性只适用于文本表,而忽略Parquet和其他格式的属性;
Hive 将serialization.null.format  适用于Parquet和其他文件格式,并在扫描期间将匹配值转换为NULL


Impala 将 serialization.null.format table property only for TEXT tables and ignores the property for Parquet and other formats. Hive respects the serialization.null.format property for Parquet 
and other formats and converts matching values to NULL during the scan. See Data Files for Text Tables for
 using the table property in Impala.


impala和hive的语义差距:

1.安全:

Impala利用Apache Sentry授权框架,该框架提供了基于角色的细粒度访问控制(FGRB),以防止未经授权的访问或篡改数据。
 在impala 3.4+版本已经和apache ranger授权框架整合。

hive和impala在CDH6.x版本中均可以授权管理。
Impala 2.0+ 版本支持 GRANT and REVOKE语句

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

Impala对查询提示使用不同的语法和名称,即[SHUFFLE]和[NOSHUFFLE],而不是MapJoin或StreamJoin。 
Impala不公开SORT BY,DISTRIBUTE BY或CLUSTER BY的MapReduce特定功能。
mpala不需要查询就包含FROM子句

3.数据类型:
3.1Impala支持一组有限的隐式强制转换。这可以帮助避免意外的铸造行为产生不良结果。

   Impala不会在字符串和数字或布尔类型之间隐式转换。始终将CAST()用于这些转换。
当从较小或不太精确的类型
转换为较大或更精确的类型时,Impala确实会在数字类型之间执行隐式强制转换。
例如,Impala将隐式地将SMALLINT转换为BIGINT或FLOAT,但要从DOUBLE转换为FLOAT或将INT转换为TINYINT,则需要在查询中调用CAST()。

  Impala确实执行从字符串到时间戳的隐式强制转换。
 Impala对于TIMESTAMP数据类型和from_unixtime()格式字符串具有一组受限制的文字格式。
3.2
Impala不会使用本地时区来存储或解释时间戳,以免发生意外时区问题而导致意外结果。
时间戳相对于UTC进行存储和解释。对于Impala和Hive之间对类似名称的日期/时间函数的某些调用,此差异可能产生不同的结果.

3.3 timestamp 范围的不同:
Impala:1400-01-01 to 9999-12-31
Hive:0000-01-01 to 9999-12-31.

3.4 Impala不会将列溢出作为NULL返回,因此客户可以区分NULL数据和溢出条件,这与使用传统数据库系统的方式类似。 Impala返回类型范围内的最大值或最小值。
例如,tinyint的有效值范围为-128到127。在Impala中,值为-200的tinyint返回-128而不是NULL。值为200的tinyint返回127。

4.不支持的其他功能:
Impala不提供虚拟列。
Impala不公开锁定。
Impala不公开某些配置属性。

参考:

CDH6:

https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_langref_unsupported.html

CDH5:

https://docs.cloudera.com/documentation/enterprise/5/latest/topics/impala_langref_unsupported.html

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页