Hive數據類型與文件存儲格式
Hive數據類型
基礎數據類型:
TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY,TIMESTAMP,DECIMAL,CHAR,VARCHAR,DATE。
復雜數據類型:
包括ARRAY,MAP,STRUCT,UNION。這些復雜類型是由基礎類型組成的。
ARRAY:ARRAY類型是由一系列同樣數據類型元素組成的,這些元素能夠通過下標來訪問。比方有一個ARRAY類型的變量fruits。它是由[‘apple’,’orange’,’mango’]組成,那麽能夠通過fruits[1]來訪問orange;
MAP:MAP包括key->value鍵值對。能夠通過key來訪問元素。比方”userlist”是一個map類型(當中username是key。password是value),那麽我們能夠通過userlist[‘username’]來得到這個用戶相應的password;
STRUCT:STRUCT能夠包括不同數據類型的元素。
這些元素能夠通過點的方式來得到,比方user是一個STRUCT類型,那麽能夠通過user.address得到這個用戶的地址。
UNION: UNIONTYPE
基本類型轉換
註:因為表格比較大。這裏對一些比較長的字符串進行縮寫,ts是timestamp的縮寫,bl是boolean的縮寫,sl是smallint的縮寫,dm是decimal的縮寫,vc是varchar的縮寫,ba是binary的縮寫。
Hive文件格式
文件格式
textfile:文本文件
Hive默認格式,數據不做壓縮,磁盤開銷大,數據解析開銷大。
可結合Gzip、Bzip2、Snappy等使用(系統自己主動檢查,執行查詢時自己主動解壓),但使用這樣的方式。hive不會對數據進行切分。從而無法對數據進行並行操作。
Sequencefile:二進制文件
SequenceFile是Hadoop API 提供的一種二進制文件,它將數據(key,value)的形式序列化到文件裏。
這樣的二進制文件內部使用Hadoop 的標準的Writable 接口實現序列化和反序列化。它與Hadoop API中的MapFile 是互相兼容的。
Hive 中的SequenceFile 繼承自Hadoop API 的SequenceFile,只是它的key為空。使用value 存放實際的值。 這樣是為了避免MR 在執行map 階段的排序過程。
Rcfile:
RCFile是Hive推出的一種專門面向列的數據格式。
它遵循“先按列劃分。再垂直劃分”的設計理念。
當查詢過程中,針對它並不關心的列時,它會在IO上跳過這些列。須要說明的是。RCFile在map階段從遠端拷貝仍然是拷貝整個數據塊,而且復制到本地文件夾後,RCFile並非真正直接跳過不須要的列,並跳到須要讀取的列, 而是通過掃描每個row group的頭部定義來實現的。
可是在整個HDFS Block 級別的頭部並未定義每個列從哪個row group起始到哪個row group結束。所以在讀取全部列的情況下。RCFile的性能反而沒有SequenceFile高。
行存儲、列存儲以及RCFile方式存儲
行存儲
HDFS塊內行存儲的樣例
基於Hadoop系統行存儲結構的長處在於高速數據載入和動態負載的高適應能力,這是因為行存儲保證了同樣記錄的全部域都在同一個集群節點,即同一個 HDFS塊。
只是,行存儲的缺點也是顯而易見的。比如它不能支持高速查詢處理,因為當查詢只針對多列表中的少數幾列時。它不能跳過不必要的列讀取;此外,因為混合著不同數據值的列,行存儲不易獲得一個極高的壓縮比,即空間利用率不易大幅提高。
列存儲
HDFS塊內列存儲的樣例
在HDFS上依照列組存儲表格的樣例。
在這個樣例中。列A和列B存儲在同一列組,而列C和列D分別存儲在單獨的列組。查詢時列存儲能夠避免讀不必要的列。 而且壓縮一個列中的類似數據能夠達到較高的壓縮比。
然而,因為元組重構的較高開銷,它並不能提供基於Hadoop系統的高速查詢處理。列存儲不能保證同一記錄的全部域都存儲在同一集群節點,行存儲的樣例中。記錄的4個域存儲在位於不同節點的3個HDFS塊中。
因此,記錄的重構將導致通過集群節點網絡的大量傳輸數據。雖然預先分組後,多個列在一起能夠降低開銷,可是對於高度動態的負載模式。它並不具備非常好的適應性。
RCFile存儲方式
HDFS塊內RCFile存儲的樣例
RCFile結合行存儲查詢的高速和列存儲節省空間的特點。
首先。RCFile保證同一行的數據位於同一節點。因此元組重構的開銷非常低。其次,像列存儲一樣,RCFile能夠利用列維度的數據壓縮,而且能跳過不必要的列讀取。
擴展接口
默認的文件讀取方式
自己定義inputformat
自己定義serde
Hive數據類型與文件存儲格式