一、What
1、什么是Hive
Hive是底層封裝了Hadoop的數(shù)據(jù)倉庫處理工具,存在的目的是讓精通SQL的分析師能夠對存放在HDFS上的大規(guī)模數(shù)據(jù)集執(zhí)行查詢,它在工作站上運行時,將用戶的HiveQL 語句通過解釋器轉換為MapReduce 作業(yè)提交到Hadoop 集群上,Hadoop 監(jiān)控作業(yè)執(zhí)行過程,然后返回作業(yè)執(zhí)行結果給用戶。Hive把結構化的數(shù)據(jù)組織為表,通過這種方式為存儲在HDFS上的數(shù)據(jù)賦予結構。
HQL是Hive的查詢語言,可以看成是SQL的一種方言,受SQL影響很深。
Hadoop是一個能夠對大量數(shù)據(jù)進行分布式處理的軟件框架。
Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS為海量的數(shù)據(jù)提供了存儲,而MapReduce則為海量的數(shù)據(jù)提供了計算。
MapReduce:分布式數(shù)據(jù)處理模型和執(zhí)行環(huán)境,應用與大型商用機集群。
HDFS:分布式文件系統(tǒng),應用與大型商用機集群。
2、Hive架構
主要分為以下幾個部分:
用戶接口
用戶接口主要有三個:CLI,Client 和 WUI。其中最常用的是 CLI,Cli 啟動的時候,會同時啟動一個 Hive 副本。Client 是 Hive 的客戶端,用戶連接至 Hive Server。在啟動 Client 模式的時候,需要指出 Hive Server 所在節(jié)點,并且在該節(jié)點啟動 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 調用執(zhí)行。
Hadoop
Hive 的數(shù)據(jù)存儲在 HDFS 中,大部分的查詢由 MapReduce 完成(不包含 * 的查詢,比如 select * from tbl 不會生成 MapReduce 任務)。
3、Impala
Impala是Cloudera公司主導開發(fā)的新型查詢系統(tǒng),它提供SQL語義,能查詢存儲在Hadoop的HDFS和HBase中的PB級大數(shù)據(jù)。已有的Hive系統(tǒng)雖然也提供了SQL語義,但由于Hive底層執(zhí)行使用的是MapReduce引擎,仍然是一個批處理過程,難以滿足查詢的交互性。相比之下,Impala的最大特點也是最大賣點就是它的快速。
Impala不需要把中間結果寫入磁盤,省掉了大量的I/O開銷。
省掉了MapReduce作業(yè)啟動的開銷。MapReduce啟動task的速度很慢(默認每個心跳間隔是3秒鐘),Impala直接通過相應的服務進程來進行作業(yè)調度,速度快了很多。
Impala完全拋棄了MapReduce這個不太適合做SQL查詢的范式,而是像Dremel一樣借鑒了MPP并行數(shù)據(jù)庫的思想另起爐灶,因此可做更多的查詢優(yōu)化,從而省掉不必要的shuffle、sort等開銷。
二、Why
Hive優(yōu)點:
1、簡單易上手:支持類SQL的查詢語言,不需要分析人員寫mapreduce;
2、可擴展,適用于處理大數(shù)據(jù)集:MR作為計算引擎,HDFS作為存儲系統(tǒng);
3、提供統(tǒng)一的元數(shù)據(jù)管理;
4、延展性好:支持自定義函數(shù);
5、容錯性好,節(jié)點出現(xiàn)問題,SQL仍可以完成執(zhí)行。
Hive缺點:
1、HQL表達能力有限:優(yōu)化迭代算法無法表達,數(shù)據(jù)挖掘
2、延遲性高,效率低:
默認為MR執(zhí)行引擎,啟動有延遲,常用于OLAP數(shù)據(jù)分析場景,不適用OLTP場景;
HQL調優(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操作:關系操作,空值判斷,算術操作,邏輯操作;
內(nèi)置函數(shù):數(shù)學和統(tǒng)計函數(shù),字符串函數(shù),日期函數(shù),條件函數(shù),聚類函數(shù),XML函數(shù),JSON函數(shù)
類型轉換:
隱式類型轉換:任何整數(shù)類型都可以隱式地轉換成一個范圍更廣的類型。所有整數(shù)類型、float和string類型都能隱式轉換為double。tinyint、smallint和int都可以轉換為float。boolean類型不能轉換為其他數(shù)據(jù)類型,timestamp可以被隱式轉換為string。
顯式數(shù)據(jù)轉化:使用cast進行數(shù)據(jù)類型轉換。
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默認為分隔的文本格式,每行存儲一個row
導入數(shù)據(jù):
load data:通過把文件復制或者移到表的目錄中,從而把數(shù)據(jù)導入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:將輸出結果存放到一張新表非常方便。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
半連接:相當于 in? ?select * from a left semi join on sales on?
3、視圖表
4、用戶定義函數(shù)UDF,必須用Java寫!
四、HQL的順序與調優(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 +結果集
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ù)
盡量原子化操作(避免復雜的語句,建議使用臨時表來過渡)
如果要用到union into 替換成insert into(性能能提上50%)
order by 改為 sort by (全局排序改為局部排序)
數(shù)據(jù)傾斜
6、詳解參考:https://blog.csdn.net/scgaliguodong123_/article/details/60135385