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標準,還包括了很多業(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]而非MapJoinStreamJoin。 Impala具體查看 Joins in Impala SELECT Statements。
  • Impala不暴露MapReduce的某些特性:SORT BY,DISTRIBUTE BY, CLUSTER BY
  • Impala不要求查詢包含FROM語句

數(shù)據(jù)類型

  • 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不會使用本地時區(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
  • 不暴露鎖
  • 不暴露某些配置屬性
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容