簡介
Hive是基於Hadoop的數據倉庫大數據組件。將易上手的SQL語句轉化成MapReduce作業。
Hive默認不支持事務, 進而導致不支持UPDATE, DELETE這些我們在數據庫中常用的操作。這一點我一直感到十分不解,你一個數據庫怎麼連基本的操作都不支持啊?在實際使用中我終於慢慢明白:
- 爲了實現事務是需要做大量工作的,寫redo log,undo log(用於回滾操作),設置隔離級別(讀未提交?讀已提交?可重複讀?)
- 而這些工作會影響到數據庫的性能,拓展性,即使是較先進的Oracle的理論拓展性也纔是100臺,8臺節點後邊際效應明顯。如果Hive支持事務,性能與拓展性將受到嚴重限制。
- Hive的作用是簡單使用MapReduce 而MapReduce生來的意義就是處理大量的數據,而具備強拓展性才讓處理海量數據成爲可能;
- 如果丟失了拓展性與性能,MapReduce有什麼意義 如果拓展性受到嚴重限制,MapReduce就不能處理大量的數據,那麼Hive也就失去了原本的意義;
- 數據倉庫中的數據是讀多寫少的,往往在加載時就已確定不再修改。
數據結構
-
元數據
Hive存儲的是一張張的數據表,而元數據就是其中的表結構;
存儲形式:存於Derby數據庫,或MySQL,Oracle數據庫。 -
表數據
表中存儲的數據。
存儲形式:每張表存於HDFS中的一個目錄中;
數據類型
- 基本數據類型
- tinyint / smallint / int / bigint : 整數類型
- float / double : 浮點數類型
- boolean : 布爾類型
- string : 字符串類型
- 複雜數據類型
- Array : 數組類型
- Map : 集合類型,鍵值對Key / Value形式
- Struct : 結構類型,包含不同數據類型的元素,跟C語言中的Struct類似
- 時間數據類型
- Date : 只包含到天的數據,沒法精確到時分秒。
- Timestamp : 長整型數字,從(格林威治時間)1970年1月1日0時0分0秒到現在的總毫秒數
數據模型
MySQL,Oracle用表作爲數據模型存儲數據。Hive自然也有。下面簡要介紹一下Hive的幾種常用的表吧。
- 內部表
最接近普通關係型數據庫的數據模型;
刪除數據時會將元數據與表數據一同刪除,HDFS中的數據文件一同被刪除;
create table bucket_table
(sid int, sname string, age int)
row format delimited fields terminated by '\t';
-- 指定數據間分隔符,默認爲製表符'\t'
- 外部表
與HDFS中某個目錄下的數據文件建立連接;
比較像指針,指向HDFS中某個目錄;
刪除數據時,會刪除元數據,與該目錄的連接,但不會真正刪除HDFS中的數據;
create external table external_student
(sid int, sname string, age int)
row format delimited fields terminated by '\t'
location '/input'; --指定表數據所在 HDFS目錄
- 桶表
用哈希算法將表數據分到5個桶中,一般可以將數據打亂放到各個桶中,可以處理數據傾斜問題
create table bucket_table
(sid int, sname string, age int)
clustered by(sname) into 5 buckets --將數據通過哈希算法分成5部分
row format delimited fields terminated by '\t';