圆咕噜咕噜 发表于 2024-9-9 13:40:50

Hive 特殊的数据类型 Array、Map、Struct

Array

数组类型,存储数据类型划一的列表数据。
我们可以使用 array 方法来创建一个数组,如下所示:
select array(1,2,3,4,5);
https://img-blog.csdnimg.cn/direct/c742bde09b6348f1b63315512f60dd07.png
如果此中的数据类型不划一,那么它会转换成统一的数据类型(前提是能够进行转换):
-- 同时存在整型和字符型 会统一转换为整型
select array(1,"1",2,3,4,5);
https://img-blog.csdnimg.cn/direct/7ee0f9874649448ba607d0aab84d83cd.png
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;
https://img-blog.csdnimg.cn/direct/c32a0be14cd4457482cf2a54ae6c9d25.png
获取数组中的数据
select
users,
users first_col,
users null_col
from
array_test;
https://img-blog.csdnimg.cn/direct/0aabf2d6bd294901a78228a696cab17f.png
获取数组值的方式和我们在 Java 中一样,采用下标的方式访问,当访问的下标超过数组的长度时,并不会报错,它会返回 null 值。
如果想要判断数组中是否存在某个值,可以使用 array_contains 方法:
select
users,
array_contains(users,"Jack") is_save_Jack,
array_contains(users,"Tom") is_save_Tom
from
array_test;
https://img-blog.csdnimg.cn/direct/efe72554fe834512b10cc40bf9539887.png
Map

Map 是 KV 键值对类型,此中存储的字段数量可多可少,但是 KV 键值对的数据类型必须提前确定。
同样,在 Hive 中也提供了创建 Map 键值对的方法 map,如下所示:
select map(1,2,3,4);
https://img-blog.csdnimg.cn/direct/9415a2f7319b49d798bd506d176a2198.png
它会将前面的数据看成 Key,后面的数据看成 Value,两两组合,形成 Map 集合。
如果此中的数据类型不划一,它同样会转换成统一的数据类型:
-- 同时存在整型和字符型 会统一转换为整型
select map(1,2,3,"4");
https://img-blog.csdnimg.cn/direct/30d921a7291e4f8daf0feb36fa1bd555.png
这里值 Value 中存在整型和字符型数据类型不统一的环境,它会统一将值 Value 都转换成字符型。
如果无法形成两两组合的键值对,则会直接报错:
select map(1,2,3,4,5);
https://img-blog.csdnimg.cn/direct/f5a99fd662a547c295ac76540362d976.png
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;
https://img-blog.csdnimg.cn/direct/1dfd2371da0b4bd396c0b0b006551e96.png
获取 Map 中的数据
select
users,
users["name"],
users["age"]
from
map_test;
https://img-blog.csdnimg.cn/direct/1581c66fcda146d9a46db355934057e5.png
如果获取一个不存在的键时,它会返回 null 值:
select
users,
users["ggg"]
from
map_test;
https://img-blog.csdnimg.cn/direct/0f50296a31c94257964ef0a5c5d0866e.png
在查询时,须要留意,Map 会区分键的大小写:
select
users,
users["Name"],
users["AGE"]
from
map_test;
https://img-blog.csdnimg.cn/direct/1028055e53f7470b8b3a1315696e5238.png
如果想要获取所有的键或者值,可以使用 map_keys() 或者 map_values():
select
users,
map_keys(users),
map_values(users)
from
map_test;
https://img-blog.csdnimg.cn/direct/3138f949060d446cb4745ee744f4a09c.png
Struct

Struct 是结构体数据类型,此中存储对象的干系信息,例如:用户ID、用户名、账号、暗码等
Struct 中的数据数量以及类型都必须是确定的。
在 Hive 中提供了创建 Struct 键值对的方法 struct,如下所示:
select struct(1,2,3,4);
https://img-blog.csdnimg.cn/direct/8b831b8f783b42d29de5b262202b5073.png
它会将所有的参数都看成为值,由系统主动生成键名。
如果想要用户来设置键名,那么可以使用另一个方法 named_struct:
select named_struct(1,2,3,4);
和 Map 一样,它会将前面的数据看成 Key,后面的数据看成 Value,两两组合,形成结构体。
如果此中的数据类型不划一,它同样会转换成统一的数据类型:
-- 同时存在整型和字符型 会统一转换为整型
select named_struct(1,2,3,"4");
https://img-blog.csdnimg.cn/direct/74812e28d10e4d84a8146188311ecd46.png
这里值 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;
https://img-blog.csdnimg.cn/direct/492e1731d7b24801a856be2b7715e4b7.png
获取 Struct 中的数据
select
users,
users.id,
users.name,
users.age
from
struct_test;
https://img-blog.csdnimg.cn/direct/6c888a18e6024b06a4227314dc5bbcbc.png
如果获取一个不存在的键时,它会直接报错:
select
users,
users.ggg
from
struct_test;
https://img-blog.csdnimg.cn/direct/29a262bc71f341d7ac524b556216466a.png
在查询时,须要留意,它和 Map 不同,忽略大小写:
select
users,
users.ID,
users.NaME,
users.Age
from
struct_test;
https://img-blog.csdnimg.cn/direct/5ad9e58bc8f442219eb46155ca12bcd4.png
嵌套使用

在 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;
https://img-blog.csdnimg.cn/direct/bcddb9ccd18d46e1a75b6f8f6b0a36d5.png
获取嵌套格式中的数据
其实和前面一样,每层使用各自的访问方式就行了。
select
users,
users.id,
users.name
from
test;
https://img-blog.csdnimg.cn/direct/5b5bb6bb2d5041b6b0f87dbe607d8aa5.png
其余格式之间的嵌套这里就不再阐明白,同砚们可以自己尝试。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Hive 特殊的数据类型 Array、Map、Struct