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; 
获取数组中的数据
select users, users[0] first_col, users[10] null_col from array_test; 
获取数组值的方式和我们在 Java 中一样,采用下标的方式访问,当访问的下标超过数组的长度时,并不会报错,它会返回 null 值。
如果想要判断数组中是否存在某个值,可以使用 array_contains 方法:
select users, array_contains(users,"Jack") is_save_Jack, array_contains(users,"Tom") is_save_Tom from array_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 中的数据
select users, users["name"], users["age"] from map_test; 
如果获取一个不存在的键时,它会返回 null 值:
select users, users["ggg"] from map_test; 
在查询时,需要注意,Map 会区分键的大小写:
select users, users["Name"], users["AGE"] from map_test; 
如果想要获取所有的键或者值,可以使用 map_keys() 或者 map_values():
select users, map_keys(users), map_values(users) from map_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 中的数据
select users, users.id, users.name, users.age from struct_test; 
如果获取一个不存在的键时,它会直接报错:
select users, users.ggg from struct_test; 
在查询时,需要注意,它和 Map 不同,忽略大小写:
select users, users.ID, users.NaME, users.Age from struct_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; 
获取嵌套格式中的数据
其实和前面一样,每层使用各自的访问方式就行了。
select users, users[0].id, users[0].name from test; 
其余格式之间的嵌套这里就不再说明了,同学们可以自己尝试。