1.hive支持的數據類型:
Hive支持原始數據類型和復雜類型,原始類型包括數值型,Boolean,字符串,時間戳。復雜類型包括array,map,struct,union。
原始數據類型:
| 類型名稱 | 大小 | 備注 |
|---|---|---|
| TINYINT | 1字節整數 | 45Y |
| SMALLINT | 2字節整數 | 12S |
| INT | 4字節整數 | 10 |
| BIGINT | 8字節整數 | 244L |
| FLOAT | 4字節單精度浮點數 | 1.0 |
| DOUBLE | 8字節雙精度浮點數 | 1.0 |
| DECIMAL | 任意精度帶符號小數 | DECIMAL(4, 2)范圍:-99.99到99.99 |
| BOOLEAN | true/false | TRUE |
| STRING | 字符串,長度不定 | “a”, ‘b’ |
| VARCHAR | 字符串,長度不定,有上限 | 0.12.0版本引入 |
| CHAR | 字符串,固定長度 | “a”, ‘b’ |
| BINARY | 存儲變長的二進制數據 | |
| TIMESTAMP | 時間戳,納秒精度 | 122327493795 |
| DATE | 日期 | ‘2016-07-03’ |
復雜類型:
| 類型名稱 | 大小 | 示例 |
|---|---|---|
| ARRAY | 存儲同類型數據 | ARRAY< data_type> |
| MAP | key-value,key必須為原始類型,value可以是任意類型 | MAP< primitive_type, data_type> |
| STRUCT | 類型可以不同 | STRUCT< col_name : data_type [COMMENT col_comment], …> |
| UNION | 在有限取值范圍內的一個值 | UNIONTYPE< data_type, data_type, …> |
2.hive支持的存儲格式:
hive支持的存儲格式包括TextFile、SequenceFile、RCFile、Avro Files、ORC Files、Parquet。
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 階段的排序過程。
SequenceFile的文件結構圖:
Header通用頭文件格式:
| SEQ | 3BYTE |
| Nun | 1byte數字 |
| keyClassName | |
| ValueClassName | |
| compression | (boolean)指明了在文件中是否啟用壓縮 |
| blockCompression | (boolean,指明是否是block壓縮) |
| compression | codec |
| Metadata | 文件元數據 |
| Sync | 頭文件結束標志 |
Block-Compressed SequenceFile格式

RCFile
RCFile是Hive推出的一種專門面向列的數據格式。 它遵循“先按列划分,再垂直划分”的設計理念。當查詢過程中,針對它並不關心的列時,它會在IO上跳過這些列。需要說明的是,RCFile在map階段從 遠端拷貝仍然是拷貝整個數據塊,並且拷貝到本地目錄后RCFile並不是真正直接跳過不需要的列,並跳到需要讀取的列, 而是通過掃描每一個row group的頭部定義來實現的,但是在整個HDFS Block 級別的頭部並沒有定義每個列從哪個row group起始到哪個row group結束。所以在讀取所有列的情況下,RCFile的性能反而沒有SequenceFile高。
