第3章Hive數據類型
3.1基本數據類型
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的字符數。
3.2集合數據類型
數據類型 |
描述 |
語法示例 |
STRUCT |
和c語言中的struct類似,都可以通過“點”符號訪問元素內容。例如,如果某個列的數據類型是STRUCT{first STRING, last STRING},那么第1個元素可以通過字段.first來引用。 |
struct() |
MAP |
MAP是一組鍵-值對元組集合,使用數組表示法可以訪問數據。例如,如果某個列的數據類型是MAP,其中鍵->值對是’first’->’John’和’last’->’Doe’,那么可以通過字段名[‘last’]獲取最后一個元素 |
map() |
ARRAY |
數組是一組具有相同類型和名稱的變量的集合。這些變量稱為數組的元素,每個數組元素都有一個編號,編號從零開始。例如,數組值為[‘John’, ‘Doe’],那么第2個元素可以通過數組名[1]進行引用。 |
Array() |
【注】:Array、Map和Java中的Array、Map類似;Struct和C語言中的Struct類似,它封裝了一個命名字段集合,復雜數據類型允許任意層次 的嵌套。
【案例】:
假設某表有如下一行,我們用JSON格式來表示其數據結構。在Hive下訪問的格式為
{ "name": "songsong", "friends": ["bingbing" , "lili"] , //列表Array, "children": { //鍵值Map, "xiao song": 18 , "xiaoxiao song": 19 } "address": { //結構Struct, "street": "hui long guan" , "city": "beijing" } }
基於上述數據結構,我們在Hive里創建對應的表,並導入數據
1)創建本地測試文件test.txt
hadoop@ubuntu:/usr/soft/module/hive$ cd /usr/soft/module/data hadoop@ubuntu:/usr/soft/module/data$ sudo vim 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
2)Hive上創建測試表test
hive> 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 STRUCT 和 ARRAY 的分隔符(數據分割符號)
> map keys terminated by ':' -- MAP中的key與value的分隔符 > lines terminated by '\n'; -- 行分隔符
4)導入文本數據到測試表
hive> load data local inpath '/usr/soft/module/data/test.txt' into table test > ;
5)訪問三種集合列里的數據,以下分別是Array、Map、Struct的訪問方式
hive> select friends[1],children['xiao song'],address.city from test where name="songsong";
結果如下:
3.3類型轉化
Hive的原子數據類型是可以進行隱式轉換的,類似於Java的類型轉換,例如某表達式使用INT類型,TINYINT會自動轉換為INT類型,但是Hive不會進行反向轉化,例如,某表達式使用TINYINT類型,INT不會自動轉換為TINYINT類型,它會返回錯誤,除非使用CAST操作。
1.隱式類型轉換規則如下
(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。