CDH5.13.x文档翻译SQL Differences Between Impala and Hive

https://www.cloudera.com/documentation/enterprise/5-13-x/topics/impala_langref_unsupported.html#langref_hiveql_delta
Impala的SQL语法遵循SQL-92标准,还包括了很多业界扩展比如内置函数。查看Porting SQL from Other Database Systems to Impala从多种数据库系统的SQL适配到Impala的讨论。

因为Impala和Hive共享metastore数据库,他们的表也共享,接下来几节会说明Impala和Hive细节上的不同。

扩展阅读:

  • HiveQL Features not Available in Impala
  • Semantic Differences Between Impala and HiveQL Features

Impala不支持的HiveQL特性

当前Impala的release不支持以下你可能已经熟悉的HiveQL:

  • 扩展机制比如 TRANSFORM,定制的文件格式,或者定制的SerDes
  • DATE数据类型
  • XML和JSON函数
  • HiveQL中特定的聚合函数:covar_pop, covar_samp, corr, percentile, percentile_approx, histogram_numeric, collect_set;
    Impala支持这些聚合函数:Impala Aggregate Functions
    以及这些分析函数: Impala Analytic Functions
  • 采样
  • Lateral views.在CDH5.5/Impala2.3以及更高版本,Impala支持对复杂类型(STRUCT,MAP,ARRAY)的查询,使用join而非EXPLODE()关键字。 查看Complex Types (CDH 5.5 or higher only) 获得Impala对复杂类型查询支持的细节。
  • 单查询中存在多个DISTINCT语句,尽管Impala对这个局限采取了一些补救措施。

Note:
默认情况下Impala只允许在每个查询中包含一个COUNT(DISTINGCT columns)表达式。
如果不需要完全精准,可以使用NDV(colum)得到一个列的distinct的估计值。一个查询可以包含多个NDV(colum)。让Impala自动重写COUNT(DISTINCT)NDV(),需要设置APPX_COUNT_DISTINCT选项。
要让结果与COUNT(DISTINCT)一致,可以使用下面的查询例子:
select v1.c1 result1, v2.c1 result2 from
(select count(distinct col1) as c1 from t1) v1
cross join
(select count(distinct col2) as c1 from t1) v2;
由于CROSS JOIN是一个代价很高的操作,还是建议尽量使用NDV()

Impala在1.2之后支持UDFs。查看Impala UDFs的细节:User-Defined Functions (UDFs)。

  • Impala支持C++编写的高性能UDFs,也支持重用一些Java-based Hive UDFs。
  • Impala支持标量UDF与UDAFs。Impala目前不支持UDTFs。
  • 在JavaUDF中出现的Hive的current_user()语句不能被Impala调用。

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; use INSERT OVERWRITE table_name or CREATE TABLE AS SELECT 基于Impala表物化查询结果至hdfs中。

Impala只在TEXT格式的表中支持serialization.null.format,忽略Parquet的属性以及其他格式。Hive支持Parquet和其他格式中的serialization.null.format属性并在扫描过程中将匹配到的值转为NULL。
查看 Data Files for Text Tables 获取Impala中使用表属性的细节。

Impala与HiveQL特性中语义上的不同

这部分阐述Impala和Hive具有相似功能、有时是相同语法,但运行时有不同语义的特性。

安全

SQL语句

ImpalaSQL语句在有时尽管和HiveQL在语法和声明上相似但语义不同。

  • Impala使用不同的语法和名字做查询提示,[SHUFFLE]和[NOSHUFFLE]而非MapJoinStreamJoin。 Impala具体查看 Joins in Impala SELECT Statements。
  • Impala不暴露MapReduce的某些特性:SORT BY,DISTRIBUTE BY, CLUSTER BY
  • Impala不要求查询包含FROM语句

数据类型

  • Impala支持有限的隐式转换。这有助于避免预料外的行为。
    1. 不会隐式地在string/numeric/boolean类型间转换。总是需要CAST()
    2. 当往更大、更精确的类型转换时,Impala不会在numeric的类型间隐式转换。比如,SMALLINT到BIGINT会隐式转换,但DOUBLEFLOATINTTINYINT就不会,而需要CAST()。
    3. Impala不会对string到timestamp做隐式转换,Impala对TIMESTAMP类型以及from_unixtime()的字符串格式有限制;详细信息 TIMESTAMP Data Type .
  • Impala不会使用本地时区保存或解释timestamps。
  • Impala TIMESTAMP 数据类型 可以表示1400-01-01 到 9999-12-31范围内的日期。这和Hive的不同(0000-01-01 到 9999-12-31)。
  • Impala不会将列值溢出处理为NULL,而是返回该类型最大或最小值。比如tinyint合法取值范围为-128到127,如果赋值-200则返回-128,赋值200则返回127。

其他

  • 不提供virtual columns
  • 不暴露锁
  • 不暴露某些配置属性

你可能感兴趣的:(CDH5.13.x文档翻译SQL Differences Between Impala and Hive)