一文詳解Hive知識(shí)體系
Hive涉及的知識(shí)點(diǎn)如下圖所示,本文將逐一講解:
正文開(kāi)始:
一. Hive概覽
1.1 hive的簡(jiǎn)介
Hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,并提供類(lèi)SQL查詢(xún)功能。
其本質(zhì)是將SQL轉(zhuǎn)換為MapReduce/Spark的任務(wù)進(jìn)行運(yùn)算,底層由HDFS來(lái)提供數(shù)據(jù)的存儲(chǔ),說(shuō)白了hive可以理解為一個(gè)將SQL轉(zhuǎn)換為MapReduce/Spark的任務(wù)的工具,甚至更進(jìn)一步可以說(shuō)hive就是一個(gè)MapReduce/Spark Sql的客戶端
為什么要使用hive ?
主要的原因有以下幾點(diǎn):
學(xué)習(xí)MapReduce的成本比較高, 項(xiàng)目周期要求太短, MapReduce如果要實(shí)現(xiàn)復(fù)雜的查詢(xún)邏輯開(kāi)發(fā)的難度是比較大的。而如果使用hive, hive采用操作接口類(lèi)似SQL語(yǔ)法, 提高快速開(kāi)發(fā)的能力. 避免去書(shū)寫(xiě)MapReduce,減少學(xué)習(xí)成本, 而且提供了功能的擴(kuò)展
hive的特點(diǎn):
可擴(kuò)展 : Hive可以自由的擴(kuò)展集群的規(guī)模,一般情況下不需要重啟服務(wù)。延展性 : Hive支持用戶自定義函數(shù),用戶可以根據(jù)自己的需求來(lái)實(shí)現(xiàn)自己的函數(shù)。容錯(cuò) : 良好的容錯(cuò)性,節(jié)點(diǎn)出現(xiàn)問(wèn)題SQL仍可完成執(zhí)行。1.2 hive的架構(gòu)
基本組成:
用戶接口:包括CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)為shell命令行;JDBC/ODBC是Hive的JAVA實(shí)現(xiàn),與傳統(tǒng)數(shù)據(jù)庫(kù)JDBC類(lèi)似;WebGUI是通過(guò)瀏覽器訪問(wèn)Hive。
元數(shù)據(jù)存儲(chǔ):通常是存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)如mysql/derby中。Hive 將元數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中。Hive 中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。
解釋器、編譯器、優(yōu)化器、執(zhí)行器:完成HQL 查詢(xún)語(yǔ)句從詞法分析、語(yǔ)法分析、編譯、優(yōu)化以及查詢(xún)計(jì)劃的生成。生成的查詢(xún)計(jì)劃存儲(chǔ)在HDFS 中,并在隨后有MapReduce 調(diào)用執(zhí)行。
1.3 hive與hadoop的關(guān)系
Hive利用HDFS存儲(chǔ)數(shù)據(jù),利用MapReduce查詢(xún)分析數(shù)據(jù)
1.4 hive與傳統(tǒng)數(shù)據(jù)庫(kù)對(duì)比
hive主要是用于海量數(shù)據(jù)的離線數(shù)據(jù)分析
查詢(xún)語(yǔ)言。由于 SQL 被廣泛的應(yīng)用在數(shù)據(jù)倉(cāng)庫(kù)中,因此,專(zhuān)門(mén)針對(duì) Hive 的特性設(shè)計(jì)了類(lèi) SQL 的查詢(xún)語(yǔ)言 HQL。熟悉 SQL 開(kāi)發(fā)的開(kāi)發(fā)者可以很方便的使用 Hive 進(jìn)行開(kāi)發(fā)。數(shù)據(jù)存儲(chǔ)位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的數(shù)據(jù)都是存儲(chǔ)在 HDFS 中的。而數(shù)據(jù)庫(kù)則可以將數(shù)據(jù)保存在塊設(shè)備或者本地文件系統(tǒng)中。數(shù)據(jù)格式。Hive 中沒(méi)有定義專(zhuān)門(mén)的數(shù)據(jù)格式,數(shù)據(jù)格式可以由用戶指定,用戶定義數(shù)據(jù)格式需要指定三個(gè)屬性:列分隔符(通常為空格、” ”、”1″)、行分隔符(””)以及讀取文件數(shù)據(jù)的方法(Hive 中默認(rèn)有三個(gè)文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加載數(shù)據(jù)的過(guò)程中,不需要從用戶數(shù)據(jù)格式到 Hive 定義的數(shù)據(jù)格式的轉(zhuǎn)換,因此,Hive 在加載的過(guò)程中不會(huì)對(duì)數(shù)據(jù)本身進(jìn)行任何修改,而只是將數(shù)據(jù)內(nèi)容復(fù)制或者移動(dòng)到相應(yīng)的 HDFS 目錄中。而在數(shù)據(jù)庫(kù)中,不同的數(shù)據(jù)庫(kù)有不同的存儲(chǔ)引擎,定義了自己的數(shù)據(jù)格式。所有數(shù)據(jù)都會(huì)按照一定的組織存儲(chǔ),因此,數(shù)據(jù)庫(kù)加載數(shù)據(jù)的過(guò)程會(huì)比較耗時(shí)。數(shù)據(jù)更新。由于 Hive 是針對(duì)數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用設(shè)計(jì)的,而數(shù)據(jù)倉(cāng)庫(kù)的內(nèi)容是讀多寫(xiě)少的。因此,Hive 中不支持對(duì)數(shù)據(jù)的改寫(xiě)和添加,所有的數(shù)據(jù)都是在加載的時(shí)候中確定好的。而數(shù)據(jù)庫(kù)中的數(shù)據(jù)通常是需要經(jīng)常進(jìn)行修改的,因此可以使用 INSERT INTO ... VALUES 添加數(shù)據(jù),使用 UPDATE ... SET 修改數(shù)據(jù)。索引。之前已經(jīng)說(shuō)過(guò),Hive 在加載數(shù)據(jù)的過(guò)程中不會(huì)對(duì)數(shù)據(jù)進(jìn)行任何處理,甚至不會(huì)對(duì)數(shù)據(jù)進(jìn)行掃描,因此也沒(méi)有對(duì)數(shù)據(jù)中的某些 Key 建立索引。Hive 要訪問(wèn)數(shù)據(jù)中滿足條件的特定值時(shí),需要暴力掃描整個(gè)數(shù)據(jù),因此訪問(wèn)延遲較高。由于 MapReduce 的引入, Hive 可以并行訪問(wèn)數(shù)據(jù),因此即使沒(méi)有索引,對(duì)于大數(shù)據(jù)量的訪問(wèn),Hive 仍然可以體現(xiàn)出優(yōu)勢(shì)。數(shù)據(jù)庫(kù)中,通常會(huì)針對(duì)一個(gè)或者幾個(gè)列建立索引,因此對(duì)于少量的特定條件的數(shù)據(jù)的訪問(wèn),數(shù)據(jù)庫(kù)可以有很高的效率,較低的延遲。由于數(shù)據(jù)的訪問(wèn)延遲較高,決定了 Hive 不適合在線數(shù)據(jù)查詢(xún)。執(zhí)行。Hive 中大多數(shù)查詢(xún)的執(zhí)行是通過(guò) Hadoop 提供的 MapReduce 來(lái)實(shí)現(xiàn)的,而數(shù)據(jù)庫(kù)通常有自己的執(zhí)行引擎。執(zhí)行延遲。之前提到,Hive 在查詢(xún)數(shù)據(jù)的時(shí)候,由于沒(méi)有索引,需要掃描整個(gè)表,因此延遲較高。另外一個(gè)導(dǎo)致 Hive 執(zhí)行延遲高的因素是 MapReduce 框架。由于 MapReduce 本身具有較高的延遲,因此在利用 MapReduce 執(zhí)行 Hive 查詢(xún)時(shí),也會(huì)有較高的延遲。相對(duì)的,數(shù)據(jù)庫(kù)的執(zhí)行延遲較低。當(dāng)然,這個(gè)低是有條件的,即數(shù)據(jù)規(guī)模較小,當(dāng)數(shù)據(jù)規(guī)模大到超過(guò)數(shù)據(jù)庫(kù)的處理能力的時(shí)候,Hive 的并行計(jì)算顯然能體現(xiàn)出優(yōu)勢(shì)。可擴(kuò)展性。由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴(kuò)展性是和 Hadoop 的可擴(kuò)展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009年的規(guī)模在 4000 臺(tái)節(jié)點(diǎn)左右)。而數(shù)據(jù)庫(kù)由于 ACID 語(yǔ)義的嚴(yán)格限制,擴(kuò)展行非常有限。目前最先進(jìn)的并行數(shù)據(jù)庫(kù) Oracle 在理論上的擴(kuò)展能力也只有 100 臺(tái)左右。數(shù)據(jù)規(guī)模。由于 Hive 建立在集群上并可以利用 MapReduce 進(jìn)行并行計(jì)算,因此可以支持很大規(guī)模的數(shù)據(jù);對(duì)應(yīng)的,數(shù)據(jù)庫(kù)可以支持的數(shù)據(jù)規(guī)模較小。
總結(jié):hive具有sql數(shù)據(jù)庫(kù)的外表,但應(yīng)用場(chǎng)景完全不同,hive只適合用來(lái)做批量數(shù)據(jù)統(tǒng)計(jì)分析。
1.5 hive的數(shù)據(jù)存儲(chǔ)Hive中所有的數(shù)據(jù)都存儲(chǔ)在 HDFS 中,沒(méi)有專(zhuān)門(mén)的數(shù)據(jù)存儲(chǔ)格式(可支持Text,SequenceFile,ParquetFile,ORC格式RCFILE等)
SequenceFile是hadoop中的一種文件格式:文件內(nèi)容是以序列化的kv對(duì)象來(lái)組織的
只需要在創(chuàng)建表的時(shí)候告訴 Hive 數(shù)據(jù)中的列分隔符和行分隔符,Hive 就可以解析數(shù)據(jù)。
Hive 中包含以下數(shù)據(jù)模型:DB、Table,External Table,Partition,Bucket。
db:在hdfs中表現(xiàn)為hive.metastore.warehouse.dir目錄下一個(gè)文件夾。
table:在hdfs中表現(xiàn)所屬db目錄下一個(gè)文件夾。
external table:與table類(lèi)似,不過(guò)其數(shù)據(jù)存放位置可以在任意指定路徑。
partition:在hdfs中表現(xiàn)為table目錄下的子目錄。
bucket:在hdfs中表現(xiàn)為同一個(gè)表目錄下根據(jù)hash散列之后的多個(gè)文件。
二、Hive表類(lèi)型
2.1 Hive 數(shù)據(jù)類(lèi)型
Hive的基本數(shù)據(jù)類(lèi)型有:TINYINT,SAMLLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,TIMESTAMP(V0.8.0+)和BINARY(V0.8.0+)。
Hive的集合類(lèi)型有:STRUCT,MAP和ARRAY。
Hive主要有四種數(shù)據(jù)模型(即表):內(nèi)部表、外部表、分區(qū)表和桶表。
表的元數(shù)據(jù)保存?zhèn)鹘y(tǒng)的數(shù)據(jù)庫(kù)的表中,當(dāng)前hive只支持Derby和MySQL數(shù)據(jù)庫(kù)。
2.2 Hive 內(nèi)部表
Hive中的內(nèi)部表和傳統(tǒng)數(shù)據(jù)庫(kù)中的表在概念上是類(lèi)似的,Hive的每個(gè)表都有自己的存儲(chǔ)目錄,除了外部表外,所有的表數(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 '班級(jí)')COMMONT '學(xué)生表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS TEXTFILE;
2.3 Hive 外部表
被external修飾的為外部表(external table),外部表指向已經(jīng)存在在Hadoop HDFS上的數(shù)據(jù),除了在刪除外部表時(shí)只刪除元數(shù)據(jù)而不會(huì)刪除表數(shù)據(jù)外,其他和內(nèi)部表很像。
創(chuàng)建外部表:
CREATE EXTERNAL TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
class STRING COMMOT '班級(jí)')COMMONT '學(xué)生表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS SEQUENCEFILE
LOCATION '/usr/test/data/students.txt';
2.4 Hive 分區(qū)表
分區(qū)表的每一個(gè)分區(qū)都對(duì)應(yīng)數(shù)據(jù)庫(kù)中相應(yīng)分區(qū)列的一個(gè)索引,但是其組織方式和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)不同。在Hive中,分區(qū)表的每一個(gè)分區(qū)都對(duì)應(yīng)表下的一個(gè)目錄,所有的分區(qū)的數(shù)據(jù)都存儲(chǔ)在對(duì)應(yīng)的目錄中。
比如說(shuō),分區(qū)表partitinTable有包含nation(國(guó)家)、ds(日期)和city(城市)3個(gè)分區(qū),其中nation = china,ds = 20130506,city = Shanghai則對(duì)應(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 '班級(jí)')COMMONT '學(xué)生表'
PARTITIONED BY (ds STRING,country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS SEQUENCEFILE;
2.5 Hive 分桶表
桶表就是對(duì)指定列進(jìn)行哈希(hash)計(jì)算,然后會(huì)根據(jù)hash值進(jìn)行切分?jǐn)?shù)據(jù),將具有不同hash值的數(shù)據(jù)寫(xiě)到每個(gè)桶對(duì)應(yīng)的文件中。
將數(shù)據(jù)按照指定的字段進(jìn)行分成多個(gè)桶中去,說(shuō)白了就是將數(shù)據(jù)按照字段進(jìn)行劃分,可以將數(shù)據(jù)按照字段劃分到多個(gè)文件當(dāng)中去。
創(chuàng)建分桶表:
CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
class STRING COMMOT '班級(jí)',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),可以通過(guò)隱藏復(fù)雜數(shù)據(jù)操作(Joins, 子查詢(xún), 過(guò)濾,數(shù)據(jù)扁平化)來(lái)于簡(jiǎn)化查詢(xún)操作。
與關(guān)系數(shù)據(jù)庫(kù)不同的是,Hive視圖并不存儲(chǔ)數(shù)據(jù)或者實(shí)例化。一旦創(chuàng)建 HIve 視圖,它的 schema 也會(huì)立刻確定下來(lái)。對(duì)底層表后續(xù)的更改(如 增加新列)并不會(huì)影響視圖的 schema。如果底層表被刪除或者改變,之后對(duì)視圖的查詢(xún)將會(huì) failed;谝陨 Hive view 的特性,我們?cè)贓TL和數(shù)據(jù)倉(cāng)庫(kù)中對(duì)于經(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)建視圖的時(shí)候是不會(huì)觸發(fā) MapReduce 的 Job,因?yàn)橹淮嬖谠獢?shù)據(jù)的改變。
但是,當(dāng)對(duì)視圖進(jìn)行查詢(xún)的時(shí)候依然會(huì)觸發(fā)一個(gè) MapReduce Job 進(jìn)程:SHOW CREATE TABLE 或者 DESC FORMATTED TABLE 語(yǔ)句來(lái)顯示通過(guò) CREATE VIEW 語(yǔ)句創(chuàng)建的視圖。以下是對(duì)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;

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車(chē)電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車(chē)】汽車(chē)E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書(shū)】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專(zhuān)題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開(kāi)始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類(lèi)新物種登上歷史舞臺(tái)
- 5 國(guó)產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來(lái)商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽(yáng)光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開(kāi)成長(zhǎng)空間
- 8 地平線自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營(yíng)收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?