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支持對復(fù)雜類型(STRUCT谎碍,MAP,ARRAY)的查詢洞焙,使用join而非EXPLODE()關(guān)鍵字蟆淀。 查看Complex Types (CDH 5.5 or higher only) 獲得Impala對復(fù)雜類型查詢支持的細節(jié)。
- 單查詢中存在多個DISTINCT語句澡匪,盡管Impala對這個局限采取了一些補救措施熔任。
Note:
默認情況下Impala只允許在每個查詢中包含一個COUNT(DISTINGCT columns)表達式。
如果不需要完全精準唁情,可以使用NDV(colum)得到一個列的distinct的估計值疑苔。一個查詢可以包含多個NDV(colum)。讓Impala自動重寫COUNT(DISTINCT)至NDV()甸鸟,需要設(shè)置APPX_COUNT_DISTINCT選項惦费。
要讓結(jié)果與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表物化查詢結(jié)果至hdfs中贾漏。
Impala只在TEXT格式的表中支持serialization.null.format候学,忽略Parquet的屬性以及其他格式。Hive支持Parquet和其他格式中的serialization.null.format屬性并在掃描過程中將匹配到的值轉(zhuǎn)為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支持有限的隱式轉(zhuǎn)換沪伙。這有助于避免預(yù)料外的行為瓮顽。
- 不會隱式地在string/numeric/boolean類型間轉(zhuǎn)換∥穑總是需要CAST()暖混。
- 當往更大、更精確的類型轉(zhuǎn)換時翁授,Impala不會在numeric的類型間隱式轉(zhuǎn)換拣播。比如,SMALLINT到BIGINT會隱式轉(zhuǎn)換黔漂,但DOUBLE到FLOAT或INT到TINYINT就不會,而需要CAST()禀酱。
- Impala不會對string到timestamp做隱式轉(zhuǎn)換炬守,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
- 不暴露鎖
- 不暴露某些配置屬性