Array
數組類型,存儲數據類型一致的列表數據。
我們可以使用 array
方法來創建一個數組,如下所示:
select array(1,2,3,4,5);
如果其中的數據類型不一致,那么它會轉換成統一的數據類型(前提是能夠進行轉換):
-- 同時存在整型和字符型 會統一轉換為整型
select array(1,"1",2,3,4,5);
Array 數據類型的使用
創建測試表:
create table if not exists array_test(
users array<string>
)
row format delimited fields terminated by '\t';
插入一些測試數據:
insert into table array_test values(array("Jack","Mary","Lily"));
查詢表數據:
select * from array_test;
獲取數組中的數據
selectusers,users[0] first_col,users[10] null_col
fromarray_test;
獲取數組值的方式和我們在 Java 中一樣,采用下標的方式訪問,當訪問的下標超過數組的長度時,并不會報錯,它會返回 null
值。
如果想要判斷數組中是否存在某個值,可以使用 array_contains
方法:
selectusers,array_contains(users,"Jack") is_save_Jack,array_contains(users,"Tom") is_save_Tom
fromarray_test;
Map
Map 是 KV 鍵值對類型,其中存儲的字段數量可多可少,但是 KV 鍵值對的數據類型必須提前確定。
同樣,在 Hive 中也提供了創建 Map 鍵值對的方法 map
,如下所示:
select map(1,2,3,4);
它會將前面的數據當作 Key,后面的數據當作 Value,兩兩組合,形成 Map 集合。
如果其中的數據類型不一致,它同樣會轉換成統一的數據類型:
-- 同時存在整型和字符型 會統一轉換為整型
select map(1,2,3,"4");
這里值 Value 中存在整型和字符型數據類型不統一的情況,它會統一將值 Value 都轉換成字符型。
如果無法形成兩兩組合的鍵值對,則會直接報錯:
select map(1,2,3,4,5);
Map 數據類型的使用
創建測試表:
create table if not exists map_test(
users map<string,string>
)
row format delimited fields terminated by '\t';
往剛剛創建的表中插入一些測試數據:
insert into table map_test values (map("name","Mary","age","20")),(map("name","Jack","age","21"));
查詢表數據:
select * from map_test;
獲取 Map 中的數據
selectusers,users["name"],users["age"]
frommap_test;
如果獲取一個不存在的鍵時,它會返回 null
值:
selectusers,users["ggg"]
frommap_test;
在查詢時,需要注意,Map 會區分鍵的大小寫:
selectusers,users["Name"],users["AGE"]
frommap_test;
如果想要獲取所有的鍵或者值,可以使用 map_keys()
或者 map_values()
:
selectusers,map_keys(users),map_values(users)
frommap_test;
Struct
Struct 是結構體數據類型,其中存儲對象的相關信息,例如:用戶ID、用戶名、賬號、密碼等
Struct 中的數據數量以及類型都必須是確定的。
在 Hive 中提供了創建 Struct 鍵值對的方法 struct
,如下所示:
select struct(1,2,3,4);
它會將所有的參數都當作為值,由系統自動生成鍵名。
如果想要用戶來設置鍵名,那么可以使用另一個方法 named_struct
:
select named_struct(1,2,3,4);
和 Map 一樣,它會將前面的數據當作 Key,后面的數據當作 Value,兩兩組合,形成結構體。
如果其中的數據類型不一致,它同樣會轉換成統一的數據類型:
-- 同時存在整型和字符型 會統一轉換為整型
select named_struct(1,2,3,"4");
這里值 Value 中存在整型和字符型數據類型不統一的情況,它會統一將值 Value 都轉換成字符型。
Struct 數據類型的使用
創建測試表:
create table if not exists struct_test(
users struct<id:int,name:string,age:int>
)
row format delimited fields terminated by '\t';
往剛剛創建的表中插入一些測試數據:
insert into table struct_test values (named_struct("id",1001,"name","Mary","age",20)),(named_struct("id",1002,"name","Jack","age",21)),(named_struct("id",1003,"name","Tom","age",20));
如果數據的類型與定義的類型產生沖突,它會直接報錯。
查詢表數據:
select * from struct_test;
獲取 Struct 中的數據
selectusers,users.id,users.name,users.age
fromstruct_test;
如果獲取一個不存在的鍵時,它會直接報錯:
selectusers,users.ggg
fromstruct_test;
在查詢時,需要注意,它和 Map 不同,忽略大小寫:
selectusers,users.ID,users.NaME,users.Age
fromstruct_test;
嵌套使用
在 Hive 中,我們可以嵌套使用特殊的數據類型。
創建測試表:
create table if not exists test(
users array<struct<id:int,name:string>>
)
row format delimited fields terminated by '\t';
插入一些測試數據:
insert into table test values(array(named_struct("id",1001,"name","Jack")));
查詢表數據:
select * from test;
獲取嵌套格式中的數據
其實和前面一樣,每層使用各自的訪問方式就行了。
selectusers,users[0].id,users[0].name
fromtest;
其余格式之間的嵌套這里就不再說明了,同學們可以自己嘗試。