@
基本資料型別
對於Hive的String型別相當於資料庫的varchar型別,該型別是一個可變的字串,不過它不能宣告其中最多能儲存多少個字元,理論上它可以儲存2GB的字元數。
集合資料型別
Hive有三種複雜資料型別ARRAY、MAP 和 STRUCT
。ARRAY和MAP與Java中的Array和Map類似,而STRUCT與C語言中的Struct類似,它封裝了一個命名欄位集合,複雜資料型別允許任意層次的巢狀。
Map和Struct的區別:Struct中屬性名是不變的!Map中key可以變化的!
案例實操
- 假設某表有如下一行,我們用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裡建立對應的表,並匯入資料。
建立本地測試檔案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
注意: 在一個表中,array每個元素之間的分隔符和Map每個Entry之間的分隔符和struct每個屬性之間的分隔符需要一致!
- Hive上建立測試表test
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';
-- 行分隔符
- 匯入文字資料到測試表
hive (default)> load data local inpath ‘/opt/module/datas/test.txt’into table test
- 訪問三種集合列裡的資料,以下分別是ARRAY,MAP,STRUCT的訪問方式
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)