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细节上的不同。
扩展阅读:
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]而非MapJoin或StreamJoin。 Impala具体查看 Joins in Impala SELECT Statements。
- Impala不暴露MapReduce的某些特性:SORT BY,DISTRIBUTE BY, CLUSTER BY。
- Impala不要求查询包含FROM语句
数据类型
- Impala支持有限的隐式转换。这有助于避免预料外的行为。
- 不会隐式地在string/numeric/boolean类型间转换。总是需要CAST()。
- 当往更大、更精确的类型转换时,Impala不会在numeric的类型间隐式转换。比如,SMALLINT到BIGINT会隐式转换,但DOUBLE到FLOAT或INT到TINYINT就不会,而需要CAST()。
- 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
- 不暴露锁
- 不暴露某些配置属性
网友评论