hadoop组件---数据仓库---hive简介
Hive簡(jiǎn)介
Hive最初是應(yīng)Facebook每天產(chǎn)生的海量新興社會(huì)網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行管理和機(jī)器學(xué)習(xí)的需求而產(chǎn)生和發(fā)展的,是建立在 Hadoop上的一個(gè)分布式、按列存儲(chǔ)的數(shù)據(jù)倉(cāng)庫(kù)基礎(chǔ)構(gòu)架。
Hive管理HDFS中存儲(chǔ)的數(shù)據(jù),并提供基于SQL的查詢語(yǔ)言(由運(yùn)行時(shí)引擎翻譯成MapReduce作業(yè))用以查詢數(shù)據(jù)。
Hive 是一個(gè)基于 Hadoop 文件系統(tǒng)之上的數(shù)據(jù)倉(cāng)庫(kù)架構(gòu)。它為數(shù)據(jù)倉(cāng)庫(kù)的管理提供了許多功能:數(shù)據(jù) ETL (抽取、轉(zhuǎn)換和加載)工具、數(shù)據(jù)存儲(chǔ)管理和大型數(shù)據(jù)集的查詢和分析能力。同時(shí) Hive 還定義了類 SQL的語(yǔ)言 – Hive QL. Hive QL 允許用戶進(jìn)行和 SQL 相似的操作,它可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,并提供簡(jiǎn)單的 SQL 查詢功能。還允許開發(fā)人員方便地使用 Mapper 和 Reducer 操作,可以將 SQL 語(yǔ)句轉(zhuǎn)換為 MapReduce 任務(wù)運(yùn)行,這對(duì) MapReduce 框架來(lái)說(shuō)是一個(gè)強(qiáng)有力的支持。
Hive設(shè)計(jì)目的就是用來(lái)管理和查詢結(jié)構(gòu)化數(shù)據(jù),它屏蔽了底層將sql語(yǔ)句轉(zhuǎn)換為MapReduce任務(wù)過(guò)程,為用戶提供的簡(jiǎn)單的SQL語(yǔ)句,將用戶從復(fù)雜的MapReduce編程中解脫出來(lái)。
官網(wǎng) http://Hive.apache.org/
官方手冊(cè) https://cwiki.apache.org/confluence/display/Hive/Home
Fackbook開發(fā)Hive的經(jīng)歷
Hive是Facebook開發(fā)的構(gòu)建于Hadoop集群之上的數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用,它提供了類似于SQL語(yǔ)法的HQL語(yǔ)句作為數(shù)據(jù)訪問(wèn)接口,這使得普通分析人員的應(yīng)用Hadoop的學(xué)習(xí)曲線變緩。至于Facebook為什么使用Hadoop和Hive組建其數(shù)據(jù)倉(cāng)庫(kù),其內(nèi)部人員分享了他們的一些經(jīng)歷,大致的過(guò)程是如下的:
1.Facebook的數(shù)據(jù)倉(cāng)庫(kù)一開始是構(gòu)建于MySQL之上的,但是隨著數(shù)據(jù)量的增加某些查詢需要幾個(gè)小時(shí)甚至幾天的時(shí)間才能完成。
2.當(dāng)數(shù)據(jù)量接近1T的時(shí)候,mysqld后臺(tái)進(jìn)程宕掉,這時(shí)他們決定將他們數(shù)據(jù)倉(cāng)庫(kù)轉(zhuǎn)移到Oracle。當(dāng)然這次轉(zhuǎn)移的過(guò)程也是付出了很大的代價(jià)的,比如支持的SQL方言不同,修改以前的運(yùn)行腳本等等。
3.Oracle應(yīng)付幾T的數(shù)據(jù)還是沒有問(wèn)題的,但是在開始收集用戶點(diǎn)擊流的數(shù)據(jù)(每天大約400G)之后,Oracle也開始撐不住了,由此又要考慮新的數(shù)據(jù)倉(cāng)庫(kù)方案。
4.內(nèi)部開發(fā)人員花了幾周的時(shí)間建立了一個(gè)并行日志處理系統(tǒng)Cheetah,這樣的話勉強(qiáng)可以在24小時(shí)之內(nèi)處理完一天的點(diǎn)擊流數(shù)據(jù)。
5.Cheetah也存在許多缺點(diǎn)。后來(lái)發(fā)現(xiàn)了Hadoop項(xiàng)目,并開始試著將日志數(shù)據(jù)同時(shí)載入Cheetah和Hadoop做對(duì)比,Hadoop在處理大規(guī)模數(shù)據(jù)時(shí)更具優(yōu)勢(shì),后來(lái)將所有的工作流都從Cheetah轉(zhuǎn)移到了Hadoop,并基于Hadoop做了很多有價(jià)值的分析。
6.后來(lái)為了使組織中的多數(shù)人能夠使用Hadoop,開發(fā)了Hive,Hive提供了類似于SQL的查詢接口,非常方便。與此同時(shí)還開發(fā)了一些其它工具。
7.現(xiàn)在集群存儲(chǔ)2.5PB的數(shù)據(jù),并且以每天15TB的數(shù)據(jù)在增長(zhǎng),每天提交3000個(gè)以上的作業(yè),大約處理55TB的數(shù)據(jù)…
現(xiàn)在很多大的互聯(lián)網(wǎng)公司出于成本考慮都在研究、使用Hadoop;數(shù)據(jù)的價(jià)值正得到越來(lái)越多的人的重視,而這種重視,又體現(xiàn)出Hadoop存在的巨大價(jià)值。
Hive的特點(diǎn)
1.學(xué)習(xí)成本低,可以通過(guò)類SQL語(yǔ)句快速實(shí)現(xiàn)簡(jiǎn)單的MapReduce統(tǒng)計(jì),不必開發(fā)專門的MapReduce應(yīng)用,十分適合數(shù)據(jù)倉(cāng)庫(kù)的統(tǒng)計(jì)分析。
2.Hive適合進(jìn)行相關(guān)的靜態(tài)數(shù)據(jù)分析,不需要快速響應(yīng)給出結(jié)果,而且數(shù)據(jù)本身不會(huì)頻繁變化。
3.Hive不支持記錄級(jí)別的更新、插入或者刪除操作,但用戶可以通過(guò)查詢生成新表或者將查詢結(jié)果導(dǎo)入到文件中。
4.Hadoop面向批處理,MapReduce任務(wù)的啟動(dòng)過(guò)程需要消耗較長(zhǎng)的時(shí)間,所以Hive查詢延時(shí)比較嚴(yán)重。需要提高查詢效率需要使用presto等連接器。
5.Hive不支持事務(wù),不支持OLTP(聯(lián)機(jī)事務(wù)處理)所需的關(guān)鍵功能。
6.Hive最適合數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用程序,可以維護(hù)海量數(shù)據(jù),而且可以對(duì)數(shù)據(jù)進(jìn)行挖掘,然后形成意見和報(bào)告。
7.可以直接使用存儲(chǔ)在Hadoop 文件系統(tǒng)中的數(shù)據(jù)。
8.不同的存儲(chǔ)類型,例如,純文本文件、HBase 中的文件。
9.內(nèi)置大量用戶函數(shù)UDF 來(lái)操作時(shí)間、字符串和其他的數(shù)據(jù)挖掘工具,支持用戶擴(kuò)展UDF 函數(shù)來(lái)完成內(nèi)置函數(shù)無(wú)法實(shí)現(xiàn)的操作。
Hive與Hadoop的關(guān)系
我們之前已經(jīng)對(duì)Hadoop進(jìn)行了一些了解,參考文章如下:
Hadoop基礎(chǔ)—-Hadoop理論(一)—-Hadoop簡(jiǎn)介
Hadoop基礎(chǔ)—-Hadoop理論(二)—–Hadoop學(xué)習(xí)路線(持續(xù)更新)
Hive 是 Hadoop 中的一個(gè)重要子項(xiàng)目,屬于Hadoop的一種組件,從下圖我們就可以大致了解 Hive 在 Hadoop 中的位置和關(guān)系。
我們經(jīng)常一提到Hadoop,就會(huì)聽別人說(shuō)到Hive, Pig, HBase, Sqoop, Mahout, Zookeeper等等。
其實(shí)這些項(xiàng)目都是Hadoop的一些相關(guān)項(xiàng)目。
它們有些是Hadoop的組件,有些是新的Hadoop框架(基于Hadoop原理的架構(gòu))。
盡管Hadoop因MapReduce及其分布式文件系統(tǒng)(HDFS,由NDFS改名而來(lái))而出名,但Hadoop這個(gè)名字也用于一組相關(guān)項(xiàng)目的統(tǒng)稱,這些相關(guān)項(xiàng)目都使用這個(gè)基礎(chǔ)平臺(tái)進(jìn)行分布式計(jì)算和海量數(shù)據(jù)處理。
Hadoop為什么會(huì)需要Hive這樣的組件呢?
大數(shù)據(jù)本質(zhì)是數(shù)據(jù),但是又有了新的特征,包括數(shù)據(jù)來(lái)源廣、數(shù)據(jù)格式多樣化(結(jié)構(gòu)化數(shù)據(jù)、非結(jié)構(gòu)化數(shù)據(jù)、Excel文件、文本文件等)、數(shù)據(jù)量大(最少也是TB級(jí)別的、甚至可能是PB級(jí)別)、數(shù)據(jù)增長(zhǎng)速度快等。
針對(duì)以上主要的4個(gè)特征我們需要考慮以下問(wèn)題:
數(shù)據(jù)來(lái)源廣,該如何采集匯總?,對(duì)應(yīng)出現(xiàn)了Sqoop,Cammel,Datax等工具。
數(shù)據(jù)采集之后,該如何存儲(chǔ)?,對(duì)應(yīng)出現(xiàn)了GFS,HDFS,TFS等分布式文件存儲(chǔ)系統(tǒng)。
由于數(shù)據(jù)增長(zhǎng)速度快,數(shù)據(jù)存儲(chǔ)就必須可以水平擴(kuò)展。
數(shù)據(jù)存儲(chǔ)之后,該如何通過(guò)運(yùn)算快速轉(zhuǎn)化成一致的格式,該如何快速運(yùn)算出自己想要的結(jié)果?
對(duì)應(yīng)的MapReduce這樣的分布式運(yùn)算框架解決了這個(gè)問(wèn)題;但是寫MapReduce需要Java代碼量很大,所以出現(xiàn)了Hive,Pig等將SQL轉(zhuǎn)化成MapReduce的解析引擎。
Hive與關(guān)系型數(shù)據(jù)庫(kù)的區(qū)別
Hive 在很多方面與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)類似(例如支持 SQL 接口),但是其底層對(duì) HDFS 和 MapReduce 的依賴意味著它的體系結(jié)構(gòu)有別于傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù),而這些區(qū)別又影響著 Hive 所支持的特性,進(jìn)而影響著 Hive 的使用。
我們可以列舉一些簡(jiǎn)單區(qū)別:
1.Hive 和關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)文件的系統(tǒng)不同,Hive 使用的是 Hadoop 的HDFS(Hadoop的分布式文件系統(tǒng)),關(guān)系數(shù)據(jù)庫(kù)則是服務(wù)器本地的文件系統(tǒng);
2.Hive 使用的計(jì)算模型是 MapReduce,而關(guān)系數(shù)據(jù)庫(kù)則是自己設(shè)計(jì)的計(jì)算模型;
3.關(guān)系數(shù)據(jù)庫(kù)都是為實(shí)時(shí)查詢的業(yè)務(wù)進(jìn)行設(shè)計(jì)的,而 Hive 則是為海量數(shù)據(jù)做數(shù)據(jù)挖掘設(shè)計(jì)的,實(shí)時(shí)性很差;實(shí)時(shí)性的區(qū)別導(dǎo)致 Hive 的應(yīng)用場(chǎng)景和關(guān)系數(shù)據(jù)庫(kù)有很大的不同;
4.Hive 很容易擴(kuò)展自己的存儲(chǔ)能力和計(jì)算能力,這個(gè)是繼承 Hadoop 的,而關(guān)系數(shù)據(jù)庫(kù)在這個(gè)方面要差很多。
5.關(guān)系數(shù)據(jù)庫(kù)里,表的加載模式是在數(shù)據(jù)加載時(shí)候強(qiáng)制確定的(表的加載模式是指數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的文件格式),如果加載數(shù)據(jù)時(shí)候發(fā)現(xiàn)加載的數(shù)據(jù)不符合模式,關(guān)系數(shù)據(jù)庫(kù)則會(huì)拒絕加載數(shù)據(jù),這個(gè)就叫“寫時(shí)模式”,寫時(shí)模式會(huì)在數(shù)據(jù)加載時(shí)候?qū)?shù)據(jù)模式進(jìn)行檢查校驗(yàn)的操作。Hive在加載數(shù)據(jù)時(shí)候和關(guān)系數(shù)據(jù)庫(kù)不同,Hive在加載數(shù)據(jù)時(shí)候不會(huì)對(duì)數(shù)據(jù)進(jìn)行檢查,也不會(huì)更改被加載的數(shù)據(jù)文件,而檢查數(shù)據(jù)格式的操作是在查詢操作時(shí)候執(zhí)行,這種模式叫“讀時(shí)模式”。在實(shí)際應(yīng)用中,寫時(shí)模式在加載數(shù)據(jù)時(shí)候會(huì)對(duì)列進(jìn)行索引,對(duì)數(shù)據(jù)進(jìn)行壓縮,因此加載數(shù)據(jù)的速度很慢,但是當(dāng)數(shù)據(jù)加載好了,我們?nèi)ゲ樵償?shù)據(jù)的時(shí)候,速度很快。但是當(dāng)我們的數(shù)據(jù)是非結(jié)構(gòu)化,存儲(chǔ)模式也是未知時(shí)候,關(guān)系數(shù)據(jù)操作這種場(chǎng)景就麻煩多了,這時(shí)候Hive就會(huì)發(fā)揮它的優(yōu)勢(shì)。
6.關(guān)系數(shù)據(jù)庫(kù)一個(gè)重要的特點(diǎn)是可以對(duì)某一行或某些行的數(shù)據(jù)進(jìn)行更新、刪除操作,Hive不支持對(duì)某個(gè)具體行的操作,Hive對(duì)數(shù)據(jù)的操作只支持覆蓋原數(shù)據(jù)和追加數(shù)據(jù)。Hive也不支持事務(wù)和索引。更新、事務(wù)和索引都是關(guān)系數(shù)據(jù)庫(kù)的特征,這些Hive都不支持,也不打算支持,原因是Hive的設(shè)計(jì)是海量數(shù)據(jù)進(jìn)行處理,全數(shù)據(jù)的掃描時(shí)常態(tài),針對(duì)某些具體數(shù)據(jù)進(jìn)行操作的效率是很差的,對(duì)于更新操作,Hive是通過(guò)查詢將原表的數(shù)據(jù)進(jìn)行轉(zhuǎn)化最后存儲(chǔ)在新表里,這和傳統(tǒng)數(shù)據(jù)庫(kù)的更新操作有很大不同。
Hive應(yīng)用場(chǎng)景
通過(guò)對(duì) Hive 與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的比較之后,其實(shí)我們不難得出 Hive 可以應(yīng)用于哪些場(chǎng)景。
Hive 構(gòu)建在基于靜態(tài)批處理的 Hadoop 之上,Hadoop 通常都有較高的延遲并且在作業(yè)提交和調(diào)度的時(shí)候需要大量的開銷。因此,Hive 不適合在大規(guī)模數(shù)據(jù)集上實(shí)現(xiàn)低延遲快速的查詢。
Hive 并不適合那些需要低延遲的應(yīng)用,例如,聯(lián)機(jī)事務(wù)處理(OLTP)。Hive 查詢操作過(guò)程嚴(yán)格遵守 Hadoop MapReduce 的作業(yè)執(zhí)行模型,Hive 將用戶的 HiveQL 語(yǔ)句通過(guò)解釋器轉(zhuǎn)換為 MapReduce 作業(yè)提交到 Hadoop 集群上,Hadoop 監(jiān)控作業(yè)執(zhí)行過(guò)程,然后返回作業(yè)執(zhí)行結(jié)果給用戶。Hive 并非為聯(lián)機(jī)事務(wù)處理而設(shè)計(jì),Hive 并不提供實(shí)時(shí)的查詢和基于行級(jí)的數(shù)據(jù)更新操作。
Hive 的最佳使用場(chǎng)合是大數(shù)據(jù)集的批處理作業(yè),例如,網(wǎng)絡(luò)日志分析。
所以 Hive一般作為大數(shù)據(jù)量的數(shù)據(jù)倉(cāng)庫(kù)來(lái)使用,如果需要提高單列的查詢效率,需要配合其他連接器,比如presto。
Hive整體架構(gòu)
Hive 本身的體系結(jié)構(gòu)如下:
從圖中我們可以看出Hadoop和mapreduce是Hive架構(gòu)的根基。Hive基本組成可以分為:
用戶接口,包括 CLI, JDBC/ODBC, WebUI
元數(shù)據(jù)存儲(chǔ),通常是存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)如 MySQL, Derby 中
解釋器、編譯器、優(yōu)化器、執(zhí)行器包括Complier、Optimizer和Executor
Hadoop, 用 HDFS 進(jìn)行存儲(chǔ),利用 MapReduce 進(jìn)行計(jì)算
也可以分為兩大類:
服務(wù)端組件和客戶端組件。
服務(wù)端組件:
Driver組件:該組件包括Complier、Optimizer和Executor,它的作用是將我們寫的HiveQL(類SQL)語(yǔ)句進(jìn)行解析、編譯優(yōu)化,生成執(zhí)行計(jì)劃,然后調(diào)用底層的mapreduce計(jì)算框架。
Metastore組件:元數(shù)據(jù)服務(wù)組件,這個(gè)組件存儲(chǔ)Hive的元數(shù)據(jù),Hive的元數(shù)據(jù)存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)里,Hive支持的關(guān)系數(shù)據(jù)庫(kù)有derby、mysql。元數(shù)據(jù)對(duì)于Hive十分重要,因此Hive支持把metastore服務(wù)獨(dú)立出來(lái),安裝到遠(yuǎn)程的服務(wù)器集群里,從而解耦Hive服務(wù)和metastore服務(wù),保證Hive運(yùn)行的健壯性,這個(gè)方面的知識(shí),我會(huì)在后面的metastore小節(jié)里做詳細(xì)的講解。
Thrift服務(wù):thrift是facebook開發(fā)的一個(gè)軟件框架,它用來(lái)進(jìn)行可擴(kuò)展且跨語(yǔ)言的服務(wù)的開發(fā),Hive集成了該服務(wù),能讓不同的編程語(yǔ)言調(diào)用Hive的接口。
客戶端組件:
CLI:command line interface,命令行接口。
Thrift客戶端:Hive架構(gòu)的許多客戶端接口是建立在thrift客戶端之上,包括JDBC和ODBC接口。HiveServer2,thrift服務(wù)器,通過(guò)JDBC/ODBC可以提供命令行之外的編程接口,如使用java、python等。
WEBGUI:Hive客戶端提供了一種通過(guò)網(wǎng)頁(yè)的方式訪問(wèn)Hive所提供的服務(wù)。這個(gè)接口對(duì)應(yīng)Hive的hwi組件(Hive web interface),使用前要啟動(dòng)hwi服務(wù)。
Hive的執(zhí)行流程如下圖所示:
Hive中包含的組件
HCatalog:其是Hive提供的Hadoop存儲(chǔ)管理層(storage management layer )服務(wù),支持用戶使用不同的數(shù)據(jù)處理工具–包含Pig和MapReduce–來(lái)更加容易的讀寫數(shù)據(jù)。
WebHCat:通過(guò)HTTP接口(REST風(fēng)格)的方式提供服務(wù),支持的操作包括:運(yùn)行MapReduce、Pig、Hive job或者Hive元數(shù)據(jù)操作等。
Hive數(shù)據(jù)存儲(chǔ)
Hive 的存儲(chǔ)是建立在 Hadoop 文件系統(tǒng)之上的。Hive 本身沒有專門的數(shù)據(jù)存儲(chǔ)格式,也不能為數(shù)據(jù)建立索引,因此用戶可以非常自由地組織 Hive 中的表,只需要在創(chuàng)建表的時(shí)候告訴 Hive 數(shù)據(jù)中的列分隔符就可以解析數(shù)據(jù)了。
Hive 中主要包括 4 種數(shù)據(jù)模型:表(Table)、外部表(External Table)、分區(qū)(Partition)以及 桶(Bucket)。
Hive 的表和數(shù)據(jù)庫(kù)中的表在概念上沒有什么本質(zhì)區(qū)別,在 Hive 中每個(gè)表都有一個(gè)對(duì)應(yīng)的存儲(chǔ)目錄。而外部表指向已經(jīng)在 HDFS 中存在的數(shù)據(jù),也可以創(chuàng)建分區(qū)。Hive 中的每個(gè)分區(qū)都對(duì)應(yīng)數(shù)據(jù)庫(kù)中相應(yīng)分區(qū)列的一個(gè)索引,但是其對(duì)分區(qū)的組織方式和傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)不同。桶在指定列進(jìn)行 Hash 計(jì)算時(shí),會(huì)根據(jù)哈希值切分?jǐn)?shù)據(jù),使每個(gè)桶對(duì)應(yīng)一個(gè)文件。
這四種數(shù)據(jù)模型詳細(xì)的使用我們將在之后的博客中學(xué)習(xí)。
Hive元數(shù)據(jù)存儲(chǔ)
由于 Hive 的元數(shù)據(jù)可能要面臨不斷地更新、修改和讀取操作,所以它顯然不適合使用 Hadoop 文件系統(tǒng)進(jìn)行存儲(chǔ)。目前 Hive 把元數(shù)據(jù)存儲(chǔ)在 RDBMS 中,比如存儲(chǔ)在 MySQL, Derby 中。
這點(diǎn)我們?cè)谏厦娼榻B的 Hive 的體系結(jié)構(gòu)圖中,也可以看出。
Hive的metastore組件是Hive元數(shù)據(jù)集中存放地。Metastore組件包括兩個(gè)部分:metastore服務(wù)和后臺(tái)數(shù)據(jù)的存儲(chǔ)。
后臺(tái)數(shù)據(jù)存儲(chǔ)的介質(zhì)就是關(guān)系數(shù)據(jù)庫(kù),例如Hive默認(rèn)的嵌入式磁盤數(shù)據(jù)庫(kù)derby,還有mysql數(shù)據(jù)庫(kù)。
Metastore服務(wù)是建立在后臺(tái)數(shù)據(jù)存儲(chǔ)介質(zhì)之上,并且可以和Hive服務(wù)進(jìn)行交互的服務(wù)組件,默認(rèn)情況下,metastore服務(wù)和Hive服務(wù)是安裝在一起的,運(yùn)行在同一個(gè)進(jìn)程當(dāng)中。我也可以把metastore服務(wù)從Hive服務(wù)里剝離出來(lái),metastore獨(dú)立安裝在一個(gè)集群里,Hive遠(yuǎn)程調(diào)用metastore服務(wù),這樣我們可以把元數(shù)據(jù)這一層放到防火墻之后,客戶端訪問(wèn)Hive服務(wù),就可以連接到元數(shù)據(jù)這一層,從而提供了更好的管理性和安全保障。
使用遠(yuǎn)程的metastore服務(wù),可以讓metastore服務(wù)和Hive服務(wù)運(yùn)行在不同的進(jìn)程里,這樣也保證了Hive的穩(wěn)定性,提升了Hive服務(wù)的效率。
Hive查詢語(yǔ)言
Hive 定義了簡(jiǎn)單的類 SQL 查詢語(yǔ)言,稱為 HQL,它允許熟悉 SQL 的用戶查詢數(shù)據(jù)。
HiveQL是一個(gè)類SQL的查詢語(yǔ)言。它模仿SQL語(yǔ)法來(lái)創(chuàng)建表,讀表到數(shù)據(jù),并查詢表。
HiveQL也允許用戶嵌入他們自定義的map-reduce腳本。這些腳本能用任何支持基于行的流式接口的語(yǔ)言寫-從標(biāo)準(zhǔn)輸入讀入并寫到標(biāo)準(zhǔn)輸出。這種靈活性也有一定的代價(jià):即字符串的轉(zhuǎn)換帶來(lái)的性能損失。
盡管如此,我們看到用戶似乎不介意于此,他們自己實(shí)現(xiàn)這些腳本。
另一個(gè)特性是多表插入。在此構(gòu)造下,用戶可以在相同的數(shù)據(jù)上通過(guò)一條HiveQL執(zhí)行多query。Hive優(yōu)化這些query,從而能共享輸入數(shù)據(jù)的掃描,這樣就增加了這些query的幾個(gè)數(shù)量級(jí)的吞吐量。
Hive為什么不直接使用SQL進(jìn)行查詢,而是要自己定義一個(gè)HiveQL
我們知道sql是有標(biāo)準(zhǔn)的規(guī)范的,例如sql92標(biāo)準(zhǔn)、sql99標(biāo)準(zhǔn)。但是各個(gè)數(shù)據(jù)庫(kù)廠商在實(shí)現(xiàn)自己的數(shù)據(jù)庫(kù)產(chǎn)品時(shí),可能并沒有遵循同一套規(guī)范,而且每個(gè)數(shù)據(jù)庫(kù)廠商基本上都會(huì)擴(kuò)展SQL語(yǔ)法,例如Oracle和Mysql的分頁(yè)查詢語(yǔ)法就是不一樣的,并且即使某個(gè)數(shù)據(jù)庫(kù)廠商實(shí)現(xiàn)了某個(gè)規(guī)范,可能也不會(huì)完全的實(shí)現(xiàn)sql規(guī)范,例如mysql官方文檔就介紹過(guò),由于考慮性能的問(wèn)題,并沒實(shí)現(xiàn)sql規(guī)范中的所有標(biāo)準(zhǔn)。
這意味,如果直接使用sql的問(wèn)題是:oracle的用戶要使用oracle數(shù)據(jù)庫(kù)的語(yǔ)法,而mysql用戶要使用mysql的語(yǔ)法,sqlserver用戶要用sqlserver的語(yǔ)法。
因此,直接使用SQL是不合適的,與其去支持不同的數(shù)據(jù)庫(kù)產(chǎn)品的語(yǔ)法,不如定義一個(gè)自己的語(yǔ)法,因?yàn)閿?shù)據(jù)庫(kù)廠商太多了, 每一個(gè)都去支持基本上是不可能的。
Hive如何實(shí)現(xiàn)類SQL查詢
Hive支持將類sql的查詢,實(shí)際上是因?yàn)槠溆幸惶子成涔ぞ?#xff0c;在數(shù)據(jù)倉(cāng)庫(kù)的構(gòu)建過(guò)程中,可以把關(guān)系型數(shù)據(jù)庫(kù)中表,字段轉(zhuǎn)換為HDFS中的文件(夾)以及文件中的列,這套工具稱之為metastore。在查詢時(shí), 可以將HiveQL轉(zhuǎn)換為mapreduce中的job。
操作Hive時(shí)一般是shell語(yǔ)言與HQL結(jié)合使用,例如:
Hive操作的一個(gè)簡(jiǎn)單的例子
首先我們創(chuàng)建一個(gè)普通的文本文件,里面只有一行數(shù)據(jù),該行也只存儲(chǔ)一個(gè)字符串,命令如下:
然后我們建一張Hive的表:
Hive –e “create table test (value string);接下來(lái)加載數(shù)據(jù):
Load data local inpath ‘home/Hadoop/test.txt’ overwrite into table test最后我們查詢下表:
Hive –e ‘select * from test’;Hive十分簡(jiǎn)單,很好入門,操作和sql很像。
更多用法我們將在之后的博客里給出。
Hive學(xué)習(xí)路線
后續(xù)的文章我們會(huì)學(xué)習(xí)
Hive的數(shù)據(jù)模型使用方式
Hive的安裝與配置
Hive常用命令
Hive使用案例
總結(jié)
以上是生活随笔為你收集整理的hadoop组件---数据仓库---hive简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用换IP软件的代理IP速度缓慢的原因是
- 下一篇: 李宏毅机器学习笔记