Hive教程進階,快速瞭解Hive與傳統數據庫的區別

之前小鳥對Hive做過一些總結,但是如果說到Hive跟傳統數據庫相比有哪些區別,很多人可能還是說不清楚,今天小鳥就帶大家總結一下Hive和傳統數據庫之間的聯繫與區別。

Hive教程進階,快速瞭解Hive與傳統數據庫的區別

一、聯繫

傳統數據庫都使用的SQL語句,而Hive使用的是HQL語句,在大部分情況下其增刪改查的語句都是類似的,因此廣義上而言,學會了SQL語句的語法也就學會了HQL語句。

Hive教程進階,快速瞭解Hive與傳統數據庫的區別

二、區別

  • 讀時模式 vs 寫時模式

用過數據庫的都知道,數據庫需要在創建時制定好數據格式,也就是俗稱的建表。傳統數據庫和Hive在使用前都需要建表,但是不知道小夥伴們有沒有遇到這種情況。傳統數據庫在建表之後往裡面導數據時,通常會因為很多問題導致SQL異常,從而加載出錯,而常見的情況就是數據格式不對。

Hive教程進階,快速瞭解Hive與傳統數據庫的區別

傳統數據庫在加載數據的時候會嚴格檢查數據格式,如果不符合規範就會拒絕加載。而這種驗證過程將耗費大量時間,這對於大數據而言,時間上是無法滿足需求的。而Hive在插入數據的時候並不會驗證數據,它只會在查詢的時候驗證。這種加載時驗證的方式稱之為讀時模式,而查詢時驗證的方式則稱之為寫時模式。

Hive教程進階,快速瞭解Hive與傳統數據庫的區別

  • 更新、事務和索引

Hive在執行HQL語句的時候,後臺其實還是使用MapReduce程序來完成任務的,而普通數據庫則是藉助自己的引擎。

MapReduce是基於HDFS系統的,通常而言Hive處理數據都是度多寫少。Hive的表更新是採用覆蓋的方式,而這種情況下處理數據絕大部分都會訪問整個表。這對在大規模數據集上運行的數據倉庫非常見效。

Hive教程進階,快速瞭解Hive與傳統數據庫的區別

早期的Hive只能利用insert into語句,以增加文件的方式向表中批量增加行。而在0.14.0版本之後,Hive允許使用Insert into table ...... value語句,這代表著可以按行加數據,不過不能大量添加。另外update和delete操作也被允許執行了。

HDFS只能允許文件的覆蓋,不允許文件的更新。所以update、delete和insert into操作引起的變化會存在一個很小的增量文件中。然後metastore在後臺的MapReduce程序會將他們合併到“基表”中。這些操作就需要事務的支持,這樣才能保證表的一致性。

Hive教程進階,快速瞭解Hive與傳統數據庫的區別

Hive的隔離性是藉助Zookeeper完成的。在0.7.0的版本Hive中,初次引入了鎖的概念。有了鎖則可以保證一個表的非查詢操作在某一時刻只能由一個進程來執行。默認情況下鎖功能是關閉的。

由於Hive是採用的寫時模式,因此數據在加載的過程中不會被校驗,因此也不會對數據建立索引。但是Hive並非不支持索引,只是Hive的索引只能建立在表的列上,而不支持主鍵或者外鍵。Hive的索引分為緊湊索引和位圖索引。緊湊索引適用於值已經經過聚簇處理的情況,而位圖索引適用於值的取值範圍較小的情況。

Hive教程進階,快速瞭解Hive與傳統數據庫的區別

其實對於更新、事務和索引,並非Hive不支持,而是影響性能,不符合最初數據倉庫的設計理念。但是隨著時間的發展,Hive在很多方面也做出了妥協,這也導致了Hive和傳統數據庫的區別越來越小。

Hive教程進階,快速瞭解Hive與傳統數據庫的區別

看完這些大家是否對Hive與傳統數據庫的區別有所瞭解呢?其實這個問題在面試中也經常會被提及,所以非常值得收藏。另外喜歡小鳥的話可以多多關注,小鳥會提供更多大數據以及互聯網的相關資訊和教程。


分享到:


相關文章: