訂閱
糾錯
加入自媒體

一文詳解Hive知識體系

2021-08-19 14:54
園陌
關(guān)注

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; 

1  2  3  4  5  6  下一頁>  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標(biāo)題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號