1.1 什么是Hive
?Hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射成為一張數(shù)據(jù)庫(kù)表,并提供類SQL的查詢功能。可以將sql語(yǔ)句轉(zhuǎn)化為MapReduce任務(wù)進(jìn)行運(yùn)行。Hive提供了一系列的工具,可以用來(lái)進(jìn)行數(shù)據(jù)提取轉(zhuǎn)化加載(ETL),這是一種可以存儲(chǔ)、查詢和分析存儲(chǔ)在 Hadoop 中的大規(guī)模數(shù)據(jù)的機(jī)制。
Hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,并提供類SQL查詢功能。
1.2 為什么使用Hive
1.)?直接使用hadoop所面臨的問(wèn)題
人員學(xué)習(xí)成本太高
項(xiàng)目周期要求太短
MapReduce實(shí)現(xiàn)復(fù)雜查詢邏輯開(kāi)發(fā)難度太大
2.)
操作接口采用類SQL語(yǔ)法,提供快速開(kāi)發(fā)的能力。
避免了去寫MapReduce,減少開(kāi)發(fā)人員的學(xué)習(xí)成本。
擴(kuò)展功能很方便。
1.3 Hive的特點(diǎn)
1.)可擴(kuò)展
Hive可以自由的擴(kuò)展集群的規(guī)模,一般情況下不需要重啟服務(wù)。
2.)延展性
Hive支持用戶自定義函數(shù),用戶可以根據(jù)自己的需求來(lái)實(shí)現(xiàn)自己的函數(shù)。
3.)容錯(cuò)
良好的容錯(cuò)性,節(jié)點(diǎn)出現(xiàn)問(wèn)題SQL仍可完成執(zhí)行。
1.4?Hive與傳統(tǒng)數(shù)據(jù)庫(kù)對(duì)比

2 框架圖:

? ? ?用戶接口: Shell/CLI,CLI(Command Line Interface),Shell 終端命令行,采用交互形式使用 Hive 命令行與 Hive 進(jìn)行交互。Cli 啟動(dòng)的時(shí)候,會(huì)同時(shí)啟動(dòng)一個(gè) Hive 副本。JDBC/ODBC客戶端是Hive的JAVA實(shí)現(xiàn),與傳統(tǒng)數(shù)據(jù)庫(kù)JDBC類似。Web UI通過(guò)瀏覽器訪問(wèn)hive。主要用來(lái)將我們的sql語(yǔ)句提交給hive。
?????Thrift服務(wù)器:Thrift 是 Facebook 開(kāi)發(fā)的一個(gè)軟件框架,可以用來(lái)進(jìn)行可擴(kuò)展且跨語(yǔ)言的服務(wù)的開(kāi)發(fā), Hive 集成了該服務(wù),能讓不同的編程語(yǔ)言調(diào)用 Hive 的接口。
?????元數(shù)據(jù)庫(kù): 存儲(chǔ)在 Hive 中的數(shù)據(jù)的描述信息。Hive 將元數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,如 mysql、(默認(rèn))derby。Hive 中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表 等),表的數(shù)據(jù)所在目錄等。
?????解釋器包含編譯器、優(yōu)化器、執(zhí)行器:完成HQL 查詢語(yǔ)句從詞法分析、語(yǔ)法分析、編譯、優(yōu)化以及查詢計(jì)劃的生成。。編譯器:主要將sql語(yǔ)句編譯成一個(gè)MR的任務(wù)。優(yōu)化器:主要是對(duì)我們的sql語(yǔ)句進(jìn)行優(yōu)化。執(zhí)行器:提交mr任務(wù),進(jìn)行執(zhí)行。
?????Hive 的數(shù)據(jù)存儲(chǔ)在 HDFS 中,查詢計(jì)劃被轉(zhuǎn)化為 MapReduce 任務(wù),在 Hadoop 中執(zhí)行.
3.Hive的數(shù)據(jù)存儲(chǔ)
?????Hive的所有數(shù)據(jù)都存儲(chǔ)在Hdfs中,沒(méi)有專門的數(shù)據(jù)存儲(chǔ)格式,也沒(méi)有為數(shù)據(jù)建立索引,用戶可以非常自由的組織 Hive 中的表,用戶定義數(shù)據(jù)格式需要指定三個(gè)屬性:列分隔符(通常為空格、”\t”、”\x001″)、行分隔符(”\n”)以及讀取文件數(shù)據(jù)的方法(Hive 中默認(rèn)有三個(gè)文件格式 TextFile,SequenceFile 以及 RCFile)。
Hive 中包含以下數(shù)據(jù)模型:DB、Table,External Table,Partition,Bucket:
1、db:在hdfs中表現(xiàn)為{hive.metastore.warehouse.dir}目錄下一個(gè)文件夾.${hive.metastore.warehouse.dir}是在配置文件中定義的數(shù)據(jù)倉(cāng)庫(kù)位置
2、table:在hdfs中表現(xiàn)所屬db目錄下一個(gè)文件夾
3、external table:與table類似,不過(guò)其數(shù)據(jù)存放位置可以在任意指定路徑
4、partition:在hdfs中表現(xiàn)為table目錄下的子目錄
5、bucket:在hdfs中表現(xiàn)為同一個(gè)表目錄下根據(jù)hash散列之后的多個(gè)文件
4.Hive的基本操作
4.1 操作數(shù)據(jù)庫(kù):
?????????? 創(chuàng)建數(shù)據(jù)庫(kù): create database if not exists 數(shù)據(jù)庫(kù)名;
???創(chuàng)建數(shù)據(jù)庫(kù)并指定hdfs存儲(chǔ)位置: create database 數(shù)據(jù)庫(kù)名 location ‘位置’;
???查看有哪些數(shù)據(jù)庫(kù): show databases;
???修改數(shù)據(jù)庫(kù)的信息(數(shù)據(jù)庫(kù)的元數(shù)據(jù)信息是不可更改的,包括數(shù)據(jù)庫(kù)的名稱以及數(shù)據(jù)庫(kù)所在的位置):alter database 數(shù)據(jù)庫(kù)名 set dbproperties()
???查看數(shù)據(jù)庫(kù)的信息:desc database 數(shù)據(jù)庫(kù)名;
???查詢?cè)敿?xì)數(shù)據(jù)庫(kù)信息:desc database extended 數(shù)據(jù)庫(kù)名;
???刪除數(shù)據(jù)庫(kù)(刪除一個(gè)空數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)下面有數(shù)據(jù)表,那么就會(huì)報(bào)錯(cuò)):drop database 數(shù)據(jù)庫(kù)名;
???強(qiáng)制刪除數(shù)據(jù)庫(kù)(包含數(shù)據(jù)庫(kù)下面的表一起刪除):drop database myhive cascade;
4.2 操作數(shù)據(jù)庫(kù)表:
? 4.2.1創(chuàng)建數(shù)據(jù)庫(kù)表語(yǔ)法:
???????????? ? ? ?CREATE [EXTERNAL] 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], …)]
???????????? ? ? ?[CLUSTERED BY (col_name, col_name, …)
???????????? ? ? ?[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
???????????? ? ? ?[ROW FORMAT row_format]
???????????? ? ? ?[STORED AS file_format]
???????????? ? ? ?[LOCATION hdfs_path]
說(shuō)明:
1、 CREATE TABLE 創(chuàng)建一個(gè)指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用 IF NOT EXISTS 選項(xiàng)來(lái)忽略這個(gè)異常。
2、 EXTERNAL關(guān)鍵字可以讓用戶創(chuàng)建一個(gè)外部表,在建表的同時(shí)指定一個(gè)指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),Hive 創(chuàng)建內(nèi)部表時(shí),會(huì)將數(shù)據(jù)移動(dòng)到數(shù)據(jù)倉(cāng)庫(kù)指向的路徑;若創(chuàng)建外部表,僅記錄數(shù)據(jù)所在的路徑,不對(duì)數(shù)據(jù)的位置做任何改變。在刪除表的時(shí)候,內(nèi)部表的元數(shù)據(jù)和數(shù)據(jù)會(huì)被一起刪除,而外部表只刪除元數(shù)據(jù),不刪除數(shù)據(jù)。
3、 LIKE 允許用戶復(fù)制現(xiàn)有的表結(jié)構(gòu),但是不復(fù)制數(shù)據(jù)。
4、 ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, …)]
用戶在建表的時(shí)候可以自定義 字段的分隔符 或者使用自帶的 SerDe。如果沒(méi)有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,將會(huì)使用自帶的 SerDe。在建表的時(shí)候,用戶還需要為表指定列,用戶在指定表的列的同時(shí)也會(huì)指定自定義的 SerDe,Hive通過(guò) SerDe 確定表的具體的列的數(shù)據(jù)。
5、 STORED AS SEQUENCEFILE|TEXTFILE|RCFILE
如果文件數(shù)據(jù)是純文本,可以使用 STORED AS TEXTFILE。如果數(shù)據(jù)需要壓縮,使用 STORED AS SEQUENCEFILE。
6、PARTITIONED BY
分區(qū)指的是在創(chuàng)建表時(shí)指定的partition的分區(qū)空間。一個(gè)表可以擁有一個(gè)或者多個(gè)分區(qū),每個(gè)分區(qū)以文件夾的形式單獨(dú)存在表文件夾的目錄下。partition就是輔助查詢,縮小查詢范圍,加快數(shù)據(jù)的檢索速度和對(duì)數(shù)據(jù)按照一定的規(guī)格和條件進(jìn)行管理。
7、CLUSTERED BY
對(duì)于每一個(gè)表(table)或者分區(qū), Hive可以進(jìn)一步組織成桶,也就是說(shuō)桶是更為細(xì)粒度的數(shù)據(jù)范圍劃分。Hive也是 針對(duì)某一列進(jìn)行桶的組織。Hive采用對(duì)列值哈希,然后除以桶的個(gè)數(shù)求余的方式?jīng)Q定該條記錄存放在哪個(gè)桶當(dāng)中。
把表(或者分區(qū))組織成桶(Bucket)有兩個(gè)理由:
(1)獲得更高的查詢處理效率。桶為表加上了額外的結(jié)構(gòu),Hive 在處理有些查詢時(shí)能利用這個(gè)結(jié)構(gòu)。具體而言,連接兩個(gè)在(包含連接列的)相同列上劃分了桶的表,可以使用 Map 端連接 (Map-side join)高效的實(shí)現(xiàn)。比如JOIN操作。對(duì)于JOIN操作兩個(gè)表有一個(gè)相同的列,如果對(duì)這兩個(gè)表都進(jìn)行了桶操作。那么將保存相同列值的桶進(jìn)行JOIN操作就可以,可以大大較少JOIN的數(shù)據(jù)量。
(2)使取樣(sampling)更高效。在處理大規(guī)模數(shù)據(jù)集時(shí),在開(kāi)發(fā)和修改查詢的階段,如果能在數(shù)據(jù)集的一小部分?jǐn)?shù)據(jù)上試運(yùn)行查詢,會(huì)帶來(lái)很多方便。