復合數據類型
Structs: structs內部的數據可以通過DOT(.)來存取,例如,表中一列c的類型為STRUCT{a INT; b INT},我們可以通過c.a來訪問域a
Maps(K-V對):訪問指定域可以通過["指定域名稱"]進行,例如,一個Map M包含了一個group-》gid的kv對,gid的值可以通過M['group']來獲取
Arrays:array中的數據為相同類型,例如,假如array A中元素['a','b','c'],則A[1]的值為'b'
類型 | 解釋 | 舉例 |
struct | 與c++中的結構體類似,可通過‘.’訪問每個域的值,比如Struct{first string,last string},可以通過name.first訪問第一個成員 | struct('john',‘doe’) |
map | 存儲key/value對,可通過['key']獲取每個key的值,比如‘first’-->'john' 可通過name['last']獲取last name。 |
map('first','john',last,'doe') |
array | 同種類型的數據集合,從0開始索引,比如['john','doe'],可通過name[1]獲取doe |
array('john','doe') |
使用實例
1.創建數據表
create table test1.employess1( name string, salary FLOAT, subordinates ARRAY<string>, deductions MAP<string,FLOAT>, address STRUCT<stree:string,city:string,state:string,zip:int>) partitioned by(country string,state string) row format delimited fields terminated by '\t' COLLECTION ITEMS TERMINATED BY ',' MAP KEYS TERMINATED BY ':' stored as textfile;
- 'FIELDS TERMINATED BY' :字段與字段之間的分隔符
- ''COLLECTION ITEMS TERMINATED BY' :一個字段各個item的分隔符
- ‘MAP KEYS TERMINATED BY’ :key value分隔符
2.測試數據
John Doe 10000.0 Mary Sith,Todd Jones Federal Taxes:0.2,State Taxes:0.1,Insurance:0.1 1 Michigan Ave.,Chicago,IL,60600 Mary Smith 80000.0 Bill King Federal Taxes:0.2,State Taxes:0.05,Insurance:0.1 100 Ontario St.,Chicago,IL,60601 Todd Jones 70000.0 Federal Taxes:0.15,State Taxes:0.03,Insurance:0.1 200 Chicago Ave.,Oak Park,NY,60700 Bill King 60000.0 Federal Taxes:0.15,State Taxes:0.03,Insurance:0.1 300 Obscure Dr.,Obscur,CA,60100
注意一下字段直接的區分標識和map中key和value的區分標識。
3.查詢數據
ARRAY查詢:
select subordinates[0] from test1.employess1;
結果:
Mary Sith Bill King NULL NULL
MAP查詢:
select deductions['Federal Taxes'] from test1.employess1;
結果:
0.2 0.2 0.15 0.15
查看map中的鍵值對個數:
select size(deductions) from test1.employess1;
結果:
3 3 3 3
STRUCT查詢:
select address.state,address.stree from test1.employess1;
結果:
IL 1 Michigan Ave. IL 100 Ontario St. NY 200 Chicago Ave. CA 300 Obscure Dr.