Hive數據類型 | Java數據類型 | 長度 | 例子 |
---|---|---|---|
TINYINT | byte | 1byte有符號整數 | 20 |
SMALINT | short | 2byte有符號整數 | 20 |
INT | int | 4byte有符號整數 | 20 |
BIGINT | long | 8byte有符號整數 | 20 |
BOOLEAN | boolean | 布爾類型,true或者false | TRUE FALSE |
FLOAT | float | 單精度浮點數 | 3.14159 |
DOUBLE | double | 雙精度浮點數 | 3.14159 |
STRING | string | 字符系列。能夠指定字符集。能夠使用單引號或者雙引號。 | ‘now is the time’ 「for all good men」 |
TIMESTAMP | 時間類型 | ||
BINARY | 字節數組 |
注:對於Hive的String類型至關於數據庫的varchar類型,該類型是一個可變的字符串,不過它不能聲明其中最多能存儲多少個字符,理論上它能夠存儲2GB的字符數。sql
數據類型 | 描述 | 語法示例 |
---|---|---|
STRUCT | 和c語言中的struct相似,均可以經過「點」符號訪問元素內容。例如,若是某個列的數據類型是STRUCT{first STRING, last STRING},那麼第1個元素能夠經過字段.first來引用。 | struct() 例如struct<street:string, city:string> |
MAP | MAP是一組鍵-值對元組集合,使用數組表示法能夠訪問數據。例如,若是某個列的數據類型是MAP,其中鍵->值對是’first’->’John’和’last’->’Doe’,那麼能夠經過字段名[‘last’]獲取最後一個元素 | map() 例如map<string, int> |
ARRAY | 數組是一組具備相同類型和名稱的變量的集合。這些變量稱爲數組的元素,每一個數組元素都有一個編號,編號從零開始。例如,數組值爲[‘John’, ‘Doe’],那麼第2個元素能夠經過數組名[1]進行引用。 | Array() 例如array
|
Hive有三種複雜數據類型ARRAY、MAP 和 STRUCT。ARRAY和MAP與Java中的Array和Map相似,而STRUCT與C語言中的Struct相似,它封裝了一個命名字段集合,複雜數據類型容許任意層次的嵌套。數據庫
1) 假設某表有以下一行,咱們用JSON格式來表示其數據結構,在Hive下訪問的格式爲json
{ "name": "songsong", "friends": ["bingbing" , "lili"] , //列表Array, "children": { //鍵值Map, "xiao song": 18 , "xiaoxiao song": 19 } "address": { //結構Struct, "street": "hui long guan" , "city": "beijing" } }
2)基於上述數據結構,咱們在Hive裏建立對應的表,並導入數據數組
建立本地測試文件test.txt,內容以下:數據結構
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
3) Hive上建立測試表shujujiegouoop
create table test( name string, friends array<string>, children map<string, int>, address struct<street:string, city:string> ) row format delimited fields terminated by ',' collection items terminated by '_' map keys terminated by ':' lines terminated by '\n'; 字段解釋: row format delimited fields terminated by ',' -- 列分隔符 collection items terminated by '_' --MAP STRUCT 和 ARRAY 的分隔符(數據分割符號) map keys terminated by ':' -- MAP中的key與value的分隔符 lines terminated by '\n'; -- 行分隔符
4)導入文本數據到測試表測試
hive (default)> load data local inpath ‘/opt/module/datas/test.txt’into table test
5)訪問三種集合列裏的數據,如下分別是ARRAY,MAP,STRUCT的訪問方式ui
hive (default)> select friends[1],children['xiao song'],address.city from test where name="songsong"; OK _c0 _c1 city lili 18 beijing Time taken: 0.076 seconds, Fetched: 1 row(s)
Hive的原子數據類型是能夠進行隱式轉換的,相似於Java的類型轉換,例如某表達式使用INT類型,TINYINT會自動轉換爲INT類型,可是Hive不會進行反向轉化,例如,某表達式使用TINYINT類型,INT不會自動轉換爲TINYINT類型,它會返回錯誤,除非使用CAST操做。code
(1). 隱式類型轉換規則以下orm
1)任何整數類型均可以隱式地轉換爲一個範圍更廣的類型,如TINYINT能夠轉換成INT,INT能夠 轉換成BIGINT。
2)全部整數類型、FLOAT和STRING類型均可以隱式地轉換成DOUBLE。
3)TINYINT、SMALLINT、INT均可以轉換爲FLOAT。
4)BOOLEAN類型不能夠轉換爲任何其它的類型。
(2). 能夠使用CAST操做顯示進行數據類型轉換
例如CAST('1' AS INT)將把字符串'1' 轉換成整數1;若是強制類型轉換失敗,如執行CAST('X' AS INT),表達式返回空值 NULL。
0: jdbc:hive2://hadoop102:10000> select '1'+2, cast('1'as int) + 2; +------+------+--+ | _c0 | _c1 | +------+------+--+ | 3.0 | 3 | +------+------+--+