基本數據類型
Hive數據類型 Java數據類型 長度 例子
TINYINT byte 1byte有符號整數 5
SMALINT short 2byte有符號整數 5
INT int 4byte有符號整數 55
BIGINT long 8byte有符號整數 5
BOOLEAN boolean 布爾類型,true或者false TRUE FALSE
FLOAT float 單精度浮點數 3.14159
DOUBLE double 雙精度浮點數 3.14159
STRING string 字符系列。可以指定字符集。可以使用單引號或者雙引號 'hello world'
"hello world"
TIMESTAMP 時間類型
BINARY 字節數組
對於Hive的String類型相當於數據庫的varchar類型,該類型是一個可變的字符串,不過它不能聲明其中最多能存儲多少個字符,理論上它可以存儲2GB的字符數。
基本數據類型
數據類型
描述 語法示例
STRUCT 和c語言中的struct類似,都可以通過“點”符號訪問元素內容。例如,如果某個列的數據類型是STRUCT{first STRING, lastSTRING},那麼第1個元素可以通過字段.first來引用。 struct()
MAP MAP是一組鍵-值對元組集合,使用數組表示法可以訪問數據。例如,如果某個列的數據類型是MAP,其中鍵->值對是’first’->’John’和’last’->’Doe’,那麼可以通過字段名[‘last’]獲取最後一個元素 map()
ARRAY 數組是一組具有相同類型和名稱的變量的集合。這些變量稱爲數組的元素,每個數組元素都有一個編號,編號從零開始。例如,數組值爲[‘John’, ‘Doe’],那麼第2個元素可以通過數組名[1]進行引用 Array()
Hive有三種複雜數據類型ARRAY、MAP 和 STRUCT。ARRAY和MAP與Java中的Array和Map類似,而STRUCT與C語言中的Struct類似,它封裝了一個命名字段集合,複雜數據類型允許任意層次的嵌套。
案例實操
1.假設某表有如下一行,我們用JSON格式來表示其數據結構。在Hive下訪問的格式爲
{
"name": "weixiaobao",
"wives": ["zengrou" , "jianning"], //列表Array,
"children": { //鍵值Map,
"hutou": 1 ,
"shuangshuang": 1
}
"address": { //結構Struct,
"street":"tong chi dao" ,
"city":"liao dong"
}
}
2.基於上述數據結構,我們在Hive裏創建對應的表,並導入數據
創建本地測試文件test.txt
weixiaobao,zengrong_jianning,hutou:1_shuangshuang:1,tong chi dao_liao dong
注意,MAP,STRUCT和ARRAY裏的元素間關係都可以用同一個字符表示,這裏用“_”。
3.Hive上創建測試表test
create table test(
name string,
wives array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited fieldsterminated by ','
collection itemsterminated by '_'
map keys terminated by ':'
lines terminated by '\n';
字段解釋:
row format delimited fields terminatedby ',' -- 列分隔符
collection items terminated by'_' --MAPSTRUCT 和 ARRAY 的分隔符(數據分割符號)
map keys terminated by ':' -- MAP中的key與value的分隔符
linesterminated by '\n'; --行分隔符
4.導入文本數據到測試表
hive (default)> load data local inpath'/opt/module/datas/test.txt' into table test;
5.訪問三種集合列裏的數據,以下分別是ARRAY,MAP,STRUCT的訪問方式
hive (default)> select wives[1],children['xiaosong'],address.city from test where name="weixiaobao";
OK
_c0 _c1 city
jianning 1 liao dong
Timetaken: 0.076 seconds, Fetched: 1 row(s)
類型轉化
Hive的原子數據類型是可以進行隱式轉換的,類似於Java的類型轉換,例如某表達式使用INT類型,TINYINT會自動轉換爲INT類型,但是Hive不會進行反向轉化,例如,某表達式使用TINYINT類型,INT不會自動轉換爲TINYINT類型,它會返回錯誤,除非使用CAST 操作。
隱式類型轉換規則如下
任何整數類型都可以隱式地轉換爲一個範圍更廣的類型,如TINYINT可以轉換成INT,INT可以轉換成BIGINT
所有整數類型、FLOAT和STRING類型都可以隱式地轉換成DOUBLE。
TINYINT、SMALLINT、INT都可以轉換爲FLOAT。
BOOLEAN類型不可以轉換爲任何其它的類型。
可以使用CAST操作顯示進行數據類型轉換,例如CAST('1' AS INT)將把字符串'1' 轉換成整數1;如果強制類型轉換失敗,如執行CAST('X' AS INT),表達式返回空值 NULL