訂閱
糾錯
加入自媒體

一文詳解Hive知識體系

2021-08-19 14:54
園陌
關注

Hive涉及的知識點如下圖所示,本文將逐一講解:

正文開始:

一. Hive概覽

1.1 hive的簡介

Hive是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供類SQL查詢功能。

其本質是將SQL轉換為MapReduce/Spark的任務進行運算,底層由HDFS來提供數據的存儲,說白了hive可以理解為一個將SQL轉換為MapReduce/Spark的任務的工具,甚至更進一步可以說hive就是一個MapReduce/Spark Sql的客戶端

為什么要使用hive ?

主要的原因有以下幾點:

學習MapReduce的成本比較高, 項目周期要求太短, MapReduce如果要實現復雜的查詢邏輯開發的難度是比較大的。而如果使用hive, hive采用操作接口類似SQL語法, 提高快速開發的能力. 避免去書寫MapReduce,減少學習成本, 而且提供了功能的擴展

hive的特點:

可擴展 :  Hive可以自由的擴展集群的規模,一般情況下不需要重啟服務。延展性 :  Hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數。容錯 :  良好的容錯性,節點出現問題SQL仍可完成執行。1.2 hive的架構

基本組成:

用戶接口:包括CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)為shell命令行;JDBC/ODBC是Hive的JAVA實現,與傳統數據庫JDBC類似;WebGUI是通過瀏覽器訪問Hive。

元數據存儲:通常是存儲在關系數據庫如mysql/derby中。Hive 將元數據存儲在數據庫中。Hive 中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。

解釋器、編譯器、優化器、執行器:完成HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS 中,并在隨后有MapReduce 調用執行。

1.3 hive與hadoop的關系

Hive利用HDFS存儲數據,利用MapReduce查詢分析數據

1.4 hive與傳統數據庫對比

hive主要是用于海量數據的離線數據分析

查詢語言。由于 SQL 被廣泛的應用在數據倉庫中,因此,專門針對 Hive 的特性設計了類 SQL 的查詢語言 HQL。熟悉 SQL 開發的開發者可以很方便的使用 Hive 進行開發。數據存儲位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的數據都是存儲在 HDFS 中的。而數據庫則可以將數據保存在塊設備或者本地文件系統中。數據格式。Hive 中沒有定義專門的數據格式,數據格式可以由用戶指定,用戶定義數據格式需要指定三個屬性:列分隔符(通常為空格、” ”、”1″)、行分隔符(””)以及讀取文件數據的方法(Hive 中默認有三個文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加載數據的過程中,不需要從用戶數據格式到 Hive 定義的數據格式的轉換,因此,Hive 在加載的過程中不會對數據本身進行任何修改,而只是將數據內容復制或者移動到相應的 HDFS 目錄中。而在數據庫中,不同的數據庫有不同的存儲引擎,定義了自己的數據格式。所有數據都會按照一定的組織存儲,因此,數據庫加載數據的過程會比較耗時。數據更新。由于 Hive 是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。因此,Hive 中不支持對數據的改寫和添加,所有的數據都是在加載的時候中確定好的。而數據庫中的數據通常是需要經常進行修改的,因此可以使用 INSERT INTO ...  VALUES 添加數據,使用 UPDATE ... SET 修改數據。索引。之前已經說過,Hive 在加載數據的過程中不會對數據進行任何處理,甚至不會對數據進行掃描,因此也沒有對數據中的某些 Key 建立索引。Hive 要訪問數據中滿足條件的特定值時,需要暴力掃描整個數據,因此訪問延遲較高。由于 MapReduce 的引入, Hive 可以并行訪問數據,因此即使沒有索引,對于大數據量的訪問,Hive 仍然可以體現出優勢。數據庫中,通常會針對一個或者幾個列建立索引,因此對于少量的特定條件的數據的訪問,數據庫可以有很高的效率,較低的延遲。由于數據的訪問延遲較高,決定了 Hive 不適合在線數據查詢。執行。Hive 中大多數查詢的執行是通過 Hadoop 提供的 MapReduce 來實現的,而數據庫通常有自己的執行引擎。執行延遲。之前提到,Hive 在查詢數據的時候,由于沒有索引,需要掃描整個表,因此延遲較高。另外一個導致 Hive 執行延遲高的因素是 MapReduce 框架。由于 MapReduce 本身具有較高的延遲,因此在利用 MapReduce 執行 Hive 查詢時,也會有較高的延遲。相對的,數據庫的執行延遲較低。當然,這個低是有條件的,即數據規模較小,當數據規模大到超過數據庫的處理能力的時候,Hive 的并行計算顯然能體現出優勢。可擴展性。由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴展性是和 Hadoop 的可擴展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009年的規模在 4000 臺節點左右)。而數據庫由于 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的并行數據庫 Oracle 在理論上的擴展能力也只有 100 臺左右。數據規模。由于 Hive 建立在集群上并可以利用 MapReduce 進行并行計算,因此可以支持很大規模的數據;對應的,數據庫可以支持的數據規模較小。

總結:hive具有sql數據庫的外表,但應用場景完全不同,hive只適合用來做批量數據統計分析。

1.5 hive的數據存儲Hive中所有的數據都存儲在 HDFS 中,沒有專門的數據存儲格式(可支持Text,SequenceFile,ParquetFile,ORC格式RCFILE等)

SequenceFile是hadoop中的一種文件格式:文件內容是以序列化的kv對象來組織的

只需要在創建表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就可以解析數據。

Hive 中包含以下數據模型:DB、Table,External Table,Partition,Bucket。

db:在hdfs中表現為hive.metastore.warehouse.dir目錄下一個文件夾。

table:在hdfs中表現所屬db目錄下一個文件夾。

external table:與table類似,不過其數據存放位置可以在任意指定路徑。

partition:在hdfs中表現為table目錄下的子目錄。

bucket:在hdfs中表現為同一個表目錄下根據hash散列之后的多個文件。

二、Hive表類型

2.1 Hive 數據類型

Hive的基本數據類型有:TINYINT,SAMLLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,TIMESTAMP(V0.8.0+)和BINARY(V0.8.0+)。

Hive的集合類型有:STRUCT,MAP和ARRAY。

Hive主要有四種數據模型(即表):內部表、外部表、分區表和桶表。

表的元數據保存傳統的數據庫的表中,當前hive只支持Derby和MySQL數據庫。

2.2 Hive 內部表

Hive中的內部表和傳統數據庫中的表在概念上是類似的,Hive的每個表都有自己的存儲目錄,除了外部表外,所有的表數據都存放在配置在hive-site.xml文件的${hive.metastore.warehouse.dir}/table_name目錄下。

創建內部表:

CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,  
        grade STRING COMMOT '班級')COMMONT '學生表'  
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS TEXTFILE;      
2.3 Hive 外部表

被external修飾的為外部表(external table),外部表指向已經存在在Hadoop HDFS上的數據,除了在刪除外部表時只刪除元數據而不會刪除表數據外,其他和內部表很像。

創建外部表:

CREATE EXTERNAL TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,  
        class STRING COMMOT '班級')COMMONT '學生表'  
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY ','  
STORE AS SEQUENCEFILE
LOCATION '/usr/test/data/students.txt';  
2.4 Hive 分區表

分區表的每一個分區都對應數據庫中相應分區列的一個索引,但是其組織方式和傳統的關系型數據庫不同。在Hive中,分區表的每一個分區都對應表下的一個目錄,所有的分區的數據都存儲在對應的目錄中。

比如說,分區表partitinTable有包含nation(國家)、ds(日期)和city(城市)3個分區,其中nation = china,ds = 20130506,city = Shanghai則對應HDFS上的目錄為:

/datawarehouse/partitinTable/nation=china/city=Shanghai/ds=20130506/。

分區中定義的變量名不能和表中的列相同。

創建分區表:

CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
        class STRING COMMOT '班級')COMMONT '學生表'  
PARTITIONED BY (ds STRING,country STRING)  
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY ','  
STORE AS SEQUENCEFILE;
2.5 Hive 分桶表

桶表就是對指定列進行哈希(hash)計算,然后會根據hash值進行切分數據,將具有不同hash值的數據寫到每個桶對應的文件中。

將數據按照指定的字段進行分成多個桶中去,說白了就是將數據按照字段進行劃分,可以將數據按照字段劃分到多個文件當中去。

創建分桶表:

CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,  
        class STRING COMMOT '班級',score SMALLINT COMMOT '總分')COMMONT '學生表'  
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 中,視圖是邏輯數據結構,可以通過隱藏復雜數據操作(Joins, 子查詢, 過濾,數據扁平化)來于簡化查詢操作。

與關系數據庫不同的是,Hive視圖并不存儲數據或者實例化。一旦創建 HIve 視圖,它的 schema 也會立刻確定下來。對底層表后續的更改(如 增加新列)并不會影響視圖的 schema。如果底層表被刪除或者改變,之后對視圖的查詢將會 failed;谝陨 Hive view 的特性,我們在ETL和數據倉庫中對于經常變化的表應慎重使用視圖。

創建視圖:

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;

創建視圖的時候是不會觸發 MapReduce 的 Job,因為只存在元數據的改變。

但是,當對視圖進行查詢的時候依然會觸發一個 MapReduce Job 進程:SHOW CREATE TABLE 或者 DESC FORMATTED TABLE 語句來顯示通過  CREATE VIEW  語句創建的視圖。以下是對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立場。如有侵權或其他問題,請聯系舉報。

發表評論

0條評論,0人參與

請輸入評論內容...

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

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

暫無評論

暫無評論

    人工智能 獵頭職位 更多
    掃碼關注公眾號
    OFweek人工智能網
    獲取更多精彩內容
    文章糾錯
    x
    *文字標題:
    *糾錯內容:
    聯系郵箱:
    *驗 證 碼:

    粵公網安備 44030502002758號