https://www.cloudera.com/documentation/enterprise/5-13-x/topics/impala_langref_unsupported.html#langref_hiveql_delta
Impala的SQL語法遵循SQL-92標準,還包括了很多業(yè)界擴展比如內(nèi)置函數(shù)。查看Porting SQL from Other Database Systems to Impala從多種數(shù)據(jù)庫系統(tǒng)的SQL適配到Impala的討論。
因為Impala和Hive共享metastore數(shù)據(jù)庫,他們的表也共享,接下來幾節(jié)會說明Impala和Hive細節(jié)上的不同。
擴展閱讀:
Impala不支持的HiveQL特性
當前Impala的release不支持以下你可能已經(jīng)熟悉的HiveQL:
- 擴展機制比如 TRANSFORM,定制的文件格式,或者定制的SerDes
- DATE數(shù)據(jù)類型
- XML和JSON函數(shù)
- HiveQL中特定的聚合函數(shù):
covar_pop, covar_samp, corr, percentile, percentile_approx, histogram_numeric, collect_set;
Impala支持這些聚合函數(shù):Impala Aggregate Functions
以及這些分析函數(shù): Impala Analytic Functions - 采樣
- Lateral views.在CDH5.5/Impala2.3以及更高版本,Impala支持對復雜類型(STRUCT,MAP,ARRAY)的查詢,使用join而非EXPLODE()關鍵字。 查看Complex Types (CDH 5.5 or higher only) 獲得Impala對復雜類型查詢支持的細節(jié)。
- 單查詢中存在多個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的細節(jié):User-Defined Functions (UDFs)。
- Impala支持C++編寫的高性能UDFs,也支持重用一些Java-based Hive UDFs。
- Impala支持標量UDF與UDAFs。Impala目前不支持UDTFs。
- 在JavaUDF中出現(xiàn)的Hive的current_user()語句不能被Impala調(diào)用。
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中使用表屬性的細節(jié)。
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語句
數(shù)據(jù)類型
- 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不會使用本地時區(qū)保存或解釋timestamps。
- Impala TIMESTAMP 數(shù)據(jù)類型 可以表示1400-01-01 到 9999-12-31范圍內(nèi)的日期。這和Hive的不同(0000-01-01 到 9999-12-31)。
- Impala不會將列值溢出處理為NULL,而是返回該類型最大或最小值。比如tinyint合法取值范圍為-128到127,如果賦值-200則返回-128,賦值200則返回127。
其他
- 不提供virtual columns
- 不暴露鎖
- 不暴露某些配置屬性