一文詳解Hive知識體系
Hive涉及的知識點如下圖所示,本文將逐一講解:
正文開始:
一. Hive概覽
1.1 hive的簡介
Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供類SQL查詢功能。
其本質(zhì)是將SQL轉(zhuǎn)換為MapReduce/Spark的任務(wù)進行運算,底層由HDFS來提供數(shù)據(jù)的存儲,說白了hive可以理解為一個將SQL轉(zhuǎn)換為MapReduce/Spark的任務(wù)的工具,甚至更進一步可以說hive就是一個MapReduce/Spark Sql的客戶端
為什么要使用hive ?
主要的原因有以下幾點:
學(xué)習(xí)MapReduce的成本比較高, 項目周期要求太短, MapReduce如果要實現(xiàn)復(fù)雜的查詢邏輯開發(fā)的難度是比較大的。而如果使用hive, hive采用操作接口類似SQL語法, 提高快速開發(fā)的能力. 避免去書寫MapReduce,減少學(xué)習(xí)成本, 而且提供了功能的擴展
hive的特點:
可擴展 : Hive可以自由的擴展集群的規(guī)模,一般情況下不需要重啟服務(wù)。延展性 : Hive支持用戶自定義函數(shù),用戶可以根據(jù)自己的需求來實現(xiàn)自己的函數(shù)。容錯 : 良好的容錯性,節(jié)點出現(xiàn)問題SQL仍可完成執(zhí)行。1.2 hive的架構(gòu)
基本組成:
用戶接口:包括CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)為shell命令行;JDBC/ODBC是Hive的JAVA實現(xiàn),與傳統(tǒng)數(shù)據(jù)庫JDBC類似;WebGUI是通過瀏覽器訪問Hive。
元數(shù)據(jù)存儲:通常是存儲在關(guān)系數(shù)據(jù)庫如mysql/derby中。Hive 將元數(shù)據(jù)存儲在數(shù)據(jù)庫中。Hive 中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。
解釋器、編譯器、優(yōu)化器、執(zhí)行器:完成HQL 查詢語句從詞法分析、語法分析、編譯、優(yōu)化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS 中,并在隨后有MapReduce 調(diào)用執(zhí)行。
1.3 hive與hadoop的關(guān)系
Hive利用HDFS存儲數(shù)據(jù),利用MapReduce查詢分析數(shù)據(jù)
1.4 hive與傳統(tǒng)數(shù)據(jù)庫對比
hive主要是用于海量數(shù)據(jù)的離線數(shù)據(jù)分析
查詢語言。由于 SQL 被廣泛的應(yīng)用在數(shù)據(jù)倉庫中,因此,專門針對 Hive 的特性設(shè)計了類 SQL 的查詢語言 HQL。熟悉 SQL 開發(fā)的開發(fā)者可以很方便的使用 Hive 進行開發(fā)。數(shù)據(jù)存儲位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的數(shù)據(jù)都是存儲在 HDFS 中的。而數(shù)據(jù)庫則可以將數(shù)據(jù)保存在塊設(shè)備或者本地文件系統(tǒng)中。數(shù)據(jù)格式。Hive 中沒有定義專門的數(shù)據(jù)格式,數(shù)據(jù)格式可以由用戶指定,用戶定義數(shù)據(jù)格式需要指定三個屬性:列分隔符(通常為空格、” ”、”1″)、行分隔符(””)以及讀取文件數(shù)據(jù)的方法(Hive 中默認有三個文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加載數(shù)據(jù)的過程中,不需要從用戶數(shù)據(jù)格式到 Hive 定義的數(shù)據(jù)格式的轉(zhuǎn)換,因此,Hive 在加載的過程中不會對數(shù)據(jù)本身進行任何修改,而只是將數(shù)據(jù)內(nèi)容復(fù)制或者移動到相應(yīng)的 HDFS 目錄中。而在數(shù)據(jù)庫中,不同的數(shù)據(jù)庫有不同的存儲引擎,定義了自己的數(shù)據(jù)格式。所有數(shù)據(jù)都會按照一定的組織存儲,因此,數(shù)據(jù)庫加載數(shù)據(jù)的過程會比較耗時。數(shù)據(jù)更新。由于 Hive 是針對數(shù)據(jù)倉庫應(yīng)用設(shè)計的,而數(shù)據(jù)倉庫的內(nèi)容是讀多寫少的。因此,Hive 中不支持對數(shù)據(jù)的改寫和添加,所有的數(shù)據(jù)都是在加載的時候中確定好的。而數(shù)據(jù)庫中的數(shù)據(jù)通常是需要經(jīng)常進行修改的,因此可以使用 INSERT INTO ... VALUES 添加數(shù)據(jù),使用 UPDATE ... SET 修改數(shù)據(jù)。索引。之前已經(jīng)說過,Hive 在加載數(shù)據(jù)的過程中不會對數(shù)據(jù)進行任何處理,甚至不會對數(shù)據(jù)進行掃描,因此也沒有對數(shù)據(jù)中的某些 Key 建立索引。Hive 要訪問數(shù)據(jù)中滿足條件的特定值時,需要暴力掃描整個數(shù)據(jù),因此訪問延遲較高。由于 MapReduce 的引入, Hive 可以并行訪問數(shù)據(jù),因此即使沒有索引,對于大數(shù)據(jù)量的訪問,Hive 仍然可以體現(xiàn)出優(yōu)勢。數(shù)據(jù)庫中,通常會針對一個或者幾個列建立索引,因此對于少量的特定條件的數(shù)據(jù)的訪問,數(shù)據(jù)庫可以有很高的效率,較低的延遲。由于數(shù)據(jù)的訪問延遲較高,決定了 Hive 不適合在線數(shù)據(jù)查詢。執(zhí)行。Hive 中大多數(shù)查詢的執(zhí)行是通過 Hadoop 提供的 MapReduce 來實現(xiàn)的,而數(shù)據(jù)庫通常有自己的執(zhí)行引擎。執(zhí)行延遲。之前提到,Hive 在查詢數(shù)據(jù)的時候,由于沒有索引,需要掃描整個表,因此延遲較高。另外一個導(dǎo)致 Hive 執(zhí)行延遲高的因素是 MapReduce 框架。由于 MapReduce 本身具有較高的延遲,因此在利用 MapReduce 執(zhí)行 Hive 查詢時,也會有較高的延遲。相對的,數(shù)據(jù)庫的執(zhí)行延遲較低。當(dāng)然,這個低是有條件的,即數(shù)據(jù)規(guī)模較小,當(dāng)數(shù)據(jù)規(guī)模大到超過數(shù)據(jù)庫的處理能力的時候,Hive 的并行計算顯然能體現(xiàn)出優(yōu)勢。可擴展性。由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴展性是和 Hadoop 的可擴展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009年的規(guī)模在 4000 臺節(jié)點左右)。而數(shù)據(jù)庫由于 ACID 語義的嚴(yán)格限制,擴展行非常有限。目前最先進的并行數(shù)據(jù)庫 Oracle 在理論上的擴展能力也只有 100 臺左右。數(shù)據(jù)規(guī)模。由于 Hive 建立在集群上并可以利用 MapReduce 進行并行計算,因此可以支持很大規(guī)模的數(shù)據(jù);對應(yīng)的,數(shù)據(jù)庫可以支持的數(shù)據(jù)規(guī)模較小。
總結(jié):hive具有sql數(shù)據(jù)庫的外表,但應(yīng)用場景完全不同,hive只適合用來做批量數(shù)據(jù)統(tǒng)計分析。
1.5 hive的數(shù)據(jù)存儲Hive中所有的數(shù)據(jù)都存儲在 HDFS 中,沒有專門的數(shù)據(jù)存儲格式(可支持Text,SequenceFile,ParquetFile,ORC格式RCFILE等)
SequenceFile是hadoop中的一種文件格式:文件內(nèi)容是以序列化的kv對象來組織的
只需要在創(chuàng)建表的時候告訴 Hive 數(shù)據(jù)中的列分隔符和行分隔符,Hive 就可以解析數(shù)據(jù)。
Hive 中包含以下數(shù)據(jù)模型:DB、Table,External Table,Partition,Bucket。
db:在hdfs中表現(xiàn)為hive.metastore.warehouse.dir目錄下一個文件夾。
table:在hdfs中表現(xiàn)所屬db目錄下一個文件夾。
external table:與table類似,不過其數(shù)據(jù)存放位置可以在任意指定路徑。
partition:在hdfs中表現(xiàn)為table目錄下的子目錄。
bucket:在hdfs中表現(xiàn)為同一個表目錄下根據(jù)hash散列之后的多個文件。
二、Hive表類型
2.1 Hive 數(shù)據(jù)類型
Hive的基本數(shù)據(jù)類型有:TINYINT,SAMLLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,TIMESTAMP(V0.8.0+)和BINARY(V0.8.0+)。
Hive的集合類型有:STRUCT,MAP和ARRAY。
Hive主要有四種數(shù)據(jù)模型(即表):內(nèi)部表、外部表、分區(qū)表和桶表。
表的元數(shù)據(jù)保存?zhèn)鹘y(tǒng)的數(shù)據(jù)庫的表中,當(dāng)前hive只支持Derby和MySQL數(shù)據(jù)庫。
2.2 Hive 內(nèi)部表
Hive中的內(nèi)部表和傳統(tǒng)數(shù)據(jù)庫中的表在概念上是類似的,Hive的每個表都有自己的存儲目錄,除了外部表外,所有的表數(shù)據(jù)都存放在配置在hive-site.xml文件的${hive.metastore.warehouse.dir}/table_name目錄下。
創(chuàng)建內(nèi)部表:
CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
grade STRING COMMOT '班級')COMMONT '學(xué)生表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS TEXTFILE;
2.3 Hive 外部表
被external修飾的為外部表(external table),外部表指向已經(jīng)存在在Hadoop HDFS上的數(shù)據(jù),除了在刪除外部表時只刪除元數(shù)據(jù)而不會刪除表數(shù)據(jù)外,其他和內(nèi)部表很像。
創(chuàng)建外部表:
CREATE EXTERNAL TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
class STRING COMMOT '班級')COMMONT '學(xué)生表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS SEQUENCEFILE
LOCATION '/usr/test/data/students.txt';
2.4 Hive 分區(qū)表
分區(qū)表的每一個分區(qū)都對應(yīng)數(shù)據(jù)庫中相應(yīng)分區(qū)列的一個索引,但是其組織方式和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫不同。在Hive中,分區(qū)表的每一個分區(qū)都對應(yīng)表下的一個目錄,所有的分區(qū)的數(shù)據(jù)都存儲在對應(yīng)的目錄中。
比如說,分區(qū)表partitinTable有包含nation(國家)、ds(日期)和city(城市)3個分區(qū),其中nation = china,ds = 20130506,city = Shanghai則對應(yīng)HDFS上的目錄為:
/datawarehouse/partitinTable/nation=china/city=Shanghai/ds=20130506/。
分區(qū)中定義的變量名不能和表中的列相同。
創(chuàng)建分區(qū)表:
CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
class STRING COMMOT '班級')COMMONT '學(xué)生表'
PARTITIONED BY (ds STRING,country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS SEQUENCEFILE;
2.5 Hive 分桶表
桶表就是對指定列進行哈希(hash)計算,然后會根據(jù)hash值進行切分?jǐn)?shù)據(jù),將具有不同hash值的數(shù)據(jù)寫到每個桶對應(yīng)的文件中。
將數(shù)據(jù)按照指定的字段進行分成多個桶中去,說白了就是將數(shù)據(jù)按照字段進行劃分,可以將數(shù)據(jù)按照字段劃分到多個文件當(dāng)中去。
創(chuàng)建分桶表:
CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
class STRING COMMOT '班級',score SMALLINT COMMOT '總分')COMMONT '學(xué)生表'
PARTITIONED BY (ds STRING,country STRING)
CLUSTERED BY(user_no) SORTED BY(score) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS SEQUENCEFILE;
2.6 Hive 視圖
在 Hive 中,視圖是邏輯數(shù)據(jù)結(jié)構(gòu),可以通過隱藏復(fù)雜數(shù)據(jù)操作(Joins, 子查詢, 過濾,數(shù)據(jù)扁平化)來于簡化查詢操作。
與關(guān)系數(shù)據(jù)庫不同的是,Hive視圖并不存儲數(shù)據(jù)或者實例化。一旦創(chuàng)建 HIve 視圖,它的 schema 也會立刻確定下來。對底層表后續(xù)的更改(如 增加新列)并不會影響視圖的 schema。如果底層表被刪除或者改變,之后對視圖的查詢將會 failed;谝陨 Hive view 的特性,我們在ETL和數(shù)據(jù)倉庫中對于經(jīng)常變化的表應(yīng)慎重使用視圖。
創(chuàng)建視圖:
CREATE VIEW employee_skills
AS
SELECT name, skills_score['DB'] AS DB,
skills_score['Perl'] AS Perl,
skills_score['Python'] AS Python,
skills_score['Sales'] as Sales,
skills_score['HR'] as HR
FROM employee;
創(chuàng)建視圖的時候是不會觸發(fā) MapReduce 的 Job,因為只存在元數(shù)據(jù)的改變。
但是,當(dāng)對視圖進行查詢的時候依然會觸發(fā)一個 MapReduce Job 進程:SHOW CREATE TABLE 或者 DESC FORMATTED TABLE 語句來顯示通過 CREATE VIEW 語句創(chuàng)建的視圖。以下是對Hive 視圖的 DDL操作:
更改視圖的屬性:
ALTER VIEW employee_skills
SET TBLPROPERTIES ('comment' = 'This is a view');
重新定義視圖:
ALTER VIEW employee_skills AS
SELECT * from employee ;
刪除視圖:
DROP VIEW employee_skills;
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
-
精彩回顧立即查看>> 【限時免費下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市