一、What
1、什么是Hive
Hive是底層封裝了Hadoop的數(shù)據(jù)倉庫處理工具,存在的目的是讓精通SQL的分析師能夠?qū)Υ娣旁贖DFS上的大規(guī)模數(shù)據(jù)集執(zhí)行查詢,它在工作站上運(yùn)行時,將用戶的HiveQL 語句通過解釋器轉(zhuǎn)換為MapReduce 作業(yè)提交到Hadoop 集群上,Hadoop 監(jiān)控作業(yè)執(zhí)行過程,然后返回作業(yè)執(zhí)行結(jié)果給用戶。Hive把結(jié)構(gòu)化的數(shù)據(jù)組織為表,通過這種方式為存儲在HDFS上的數(shù)據(jù)賦予結(jié)構(gòu)。
HQL是Hive的查詢語言,可以看成是SQL的一種方言,受SQL影響很深。
Hadoop是一個能夠?qū)Υ罅繑?shù)據(jù)進(jìn)行分布式處理的軟件框架。
Hadoop的框架最核心的設(shè)計就是:HDFS和MapReduce。HDFS為海量的數(shù)據(jù)提供了存儲,而MapReduce則為海量的數(shù)據(jù)提供了計算。
MapReduce:分布式數(shù)據(jù)處理模型和執(zhí)行環(huán)境,應(yīng)用與大型商用機(jī)集群。
HDFS:分布式文件系統(tǒng),應(yīng)用與大型商用機(jī)集群。
2、Hive架構(gòu)
主要分為以下幾個部分:
用戶接口
用戶接口主要有三個:CLI,Client 和 WUI。其中最常用的是 CLI,Cli 啟動的時候,會同時啟動一個 Hive 副本。Client 是 Hive 的客戶端,用戶連接至 Hive Server。在啟動 Client 模式的時候,需要指出 Hive Server 所在節(jié)點(diǎn),并且在該節(jié)點(diǎn)啟動 Hive Server。 WUI 是通過瀏覽器訪問 Hive。
元數(shù)據(jù)存儲
Hive 將元數(shù)據(jù)存儲在數(shù)據(jù)庫中,如 mysql、derby。Hive 中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。
解釋器、編譯器、優(yōu)化器、執(zhí)行器
解釋器、編譯器、優(yōu)化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優(yōu)化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,并在隨后由 MapReduce 調(diào)用執(zhí)行。
Hadoop
Hive 的數(shù)據(jù)存儲在 HDFS 中,大部分的查詢由 MapReduce 完成(不包含 * 的查詢,比如 select * from tbl 不會生成 MapReduce 任務(wù))。
3、Impala
Impala是Cloudera公司主導(dǎo)開發(fā)的新型查詢系統(tǒng),它提供SQL語義,能查詢存儲在Hadoop的HDFS和HBase中的PB級大數(shù)據(jù)。已有的Hive系統(tǒng)雖然也提供了SQL語義,但由于Hive底層執(zhí)行使用的是MapReduce引擎,仍然是一個批處理過程,難以滿足查詢的交互性。相比之下,Impala的最大特點(diǎn)也是最大賣點(diǎn)就是它的快速。
Impala不需要把中間結(jié)果寫入磁盤,省掉了大量的I/O開銷。
省掉了MapReduce作業(yè)啟動的開銷。MapReduce啟動task的速度很慢(默認(rèn)每個心跳間隔是3秒鐘),Impala直接通過相應(yīng)的服務(wù)進(jìn)程來進(jìn)行作業(yè)調(diào)度,速度快了很多。
Impala完全拋棄了MapReduce這個不太適合做SQL查詢的范式,而是像Dremel一樣借鑒了MPP并行數(shù)據(jù)庫的思想另起爐灶,因此可做更多的查詢優(yōu)化,從而省掉不必要的shuffle、sort等開銷。
二、Why
Hive優(yōu)點(diǎn):
1、簡單易上手:支持類SQL的查詢語言,不需要分析人員寫mapreduce;
2、可擴(kuò)展,適用于處理大數(shù)據(jù)集:MR作為計算引擎,HDFS作為存儲系統(tǒng);
3、提供統(tǒng)一的元數(shù)據(jù)管理;
4、延展性好:支持自定義函數(shù);
5、容錯性好,節(jié)點(diǎn)出現(xiàn)問題,SQL仍可以完成執(zhí)行。
Hive缺點(diǎn):
1、HQL表達(dá)能力有限:優(yōu)化迭代算法無法表達(dá),數(shù)據(jù)挖掘
2、延遲性高,效率低:
默認(rèn)為MR執(zhí)行引擎,啟動有延遲,常用于OLAP數(shù)據(jù)分析場景,不適用OLTP場景;
HQL調(diào)優(yōu)困難,粒度比較粗;
Hive可控性差。
三、How
1、適用場景
作為數(shù)據(jù)倉庫ETL:
數(shù)據(jù)挖掘:
用戶行為分析:
文本分析:
2、HQL的數(shù)據(jù)類型
tinyint,smallint,int,bigint,float,double,boolean,string,binary,timestamp;
array,map,struct
3、HQL的操作與函數(shù)
SQL操作:關(guān)系操作,空值判斷,算術(shù)操作,邏輯操作;
內(nèi)置函數(shù):數(shù)學(xué)和統(tǒng)計函數(shù),字符串函數(shù),日期函數(shù),條件函數(shù),聚類函數(shù),XML函數(shù),JSON函數(shù)
類型轉(zhuǎn)換:
隱式類型轉(zhuǎn)換:任何整數(shù)類型都可以隱式地轉(zhuǎn)換成一個范圍更廣的類型。所有整數(shù)類型、float和string類型都能隱式轉(zhuǎn)換為double。tinyint、smallint和int都可以轉(zhuǎn)換為float。boolean類型不能轉(zhuǎn)換為其他數(shù)據(jù)類型,timestamp可以被隱式轉(zhuǎn)換為string。
顯式數(shù)據(jù)轉(zhuǎn)化:使用cast進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。
4、表
內(nèi)部表:所有的處理都由Hive完成
創(chuàng)建內(nèi)部表:
CREATE TABLE IF NOT EXISTS table_name[(col_name data_type [COMMENT col_comment], ...)][COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)][STORED AS file_format] [LOCATION '/mso/export/test']
加載數(shù)據(jù):
加載本地數(shù)據(jù):Load data local inpath '/......' into tablename;
加載HDFS數(shù)據(jù)? load data inpath 'hdfs://.....' into tablename
查看HDFS數(shù)據(jù):
操作數(shù)據(jù)庫:
外部表:要使用hive和其他工具來處理同一個數(shù)據(jù)集
分區(qū)和分桶:partitioned by,clustered by[column name] into x buckets
存儲格式:沒有用 row format 或者 started as 字句聲明的時候,Hive默認(rèn)為分隔的文本格式,每行存儲一個row
導(dǎo)入數(shù)據(jù):
load data:通過把文件復(fù)制或者移到表的目錄中,從而把數(shù)據(jù)導(dǎo)入hive的表或者分區(qū)
insert:把數(shù)據(jù)從一個hive表填充到另一個hive表:insert overwrite table tablename select col1,col2 from source
對于分區(qū)的表,可以使用partition子句來指明數(shù)據(jù)要插入哪個分區(qū):insert overwrite table tablename partition(dt=' ') select col1,col2 from source
多表插入:把insert語句倒過來,from放在最前面,這樣可以在同一個查詢中使用多個insert語句。效率更高,因為只要掃描一遍源表就可以生成多個不相交的輸出。
from source?
insert overwrite table tablename select col1,count(distinct col2) group by col1
insert overwrite table tablename1.....
create table...as select:將輸出結(jié)果存放到一張新表非常方便。select語句失敗,新表就不會被創(chuàng)建。
表的修改:
1、重命名:使用 alter table source rename? to target 重命名表
2、新增一個表列:alter table target add columns(col3 string)
表的丟棄:
1、刪除表的數(shù)據(jù)和元數(shù)據(jù):drop table??
查詢數(shù)據(jù):
1、排序和聚類:order by? ?sort by? distribute by
from records select year,temperature distribute by year sort by year asc,temperature desc
2、連接:Hive 只能使用等值連接,hive不允許在select 語句的from字句中列出要連接的表,或者在where字句中指定連接的條件。
內(nèi)連接:join?
外連接:left outer join,right outer join,full outer join
半連接:相當(dāng)于 in? ?select * from a left semi join on sales on?
3、視圖表
4、用戶定義函數(shù)UDF,必須用Java寫!
四、HQL的順序與調(diào)優(yōu)
1、Hive函數(shù)的執(zhí)行順序:https://www.cnblogs.com/jiangxiaoxian/p/7155636.html
from + 表名
on +字段
(left/right)join +表名
where +條件
group by +字段
having + 條件
select +字段
distinct +字段
union +結(jié)果集
order by +字段
limit +數(shù)量
2、窗口函數(shù):https://blog.https://www.cnblogs.com/jiangxiaoxian/p/7155636.html.net/qq_26937525/article/details/54925827
3、分析函數(shù)
4、日期函數(shù):https://blog.csdn.net/u013421629/article/details/80450047
5、優(yōu)化
分區(qū)表-提高查詢(partition)
列式存儲(parquet和orc)
表連接優(yōu)化(將大表放后面)
盡早的過濾數(shù)據(jù)
盡量原子化操作(避免復(fù)雜的語句,建議使用臨時表來過渡)
如果要用到union into 替換成insert into(性能能提上50%)
order by 改為 sort by (全局排序改為局部排序)
數(shù)據(jù)傾斜
6、詳解參考:https://blog.csdn.net/scgaliguodong123_/article/details/60135385