hive中比关系型数据库中多了一些特殊的类型:
1)array:数组是相同类型的,下标从0开始
array01('英语','化学','物理')
array01[1] --->'化学'
传统关系型数据库中:
name like1 like2 like3 like4 like5
张三 足球 汽车 读书 喝茶 NUll
李四 篮球 电影 读书 音乐 美食
hive数据库中:
name likes
张三 足球 ,汽车,读书,喝茶
李四 篮球 ,电影,读书,音乐,美食
create table s1(
id int,
name string,
likes array<string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
lines terminated by '\n';
s1.txt
1,张三,足球-汽车-读书-喝茶
2,李四,篮球-电影-读书-音乐-美食
load data local inpath '/home/hyxy/Desktop/s1.txt' overwrite into table s1;
select * from s1;
hive> select likes[0] from s1;
足球
篮球
hive> select * from s1 where likes[0]='足球';
1 张三 ["足球","汽车","读书","喝茶"]
EXPLODE关键字:
explode就是将hive一行中复杂的array或者map结构拆分成多行:
hive>select id,name,hobby from s1 lateral view explode(likes) likes as hobby;
OK
1 张三 足球
1 张三 汽车
1 张三 读书
1 张三 喝茶
2 李四 篮球
2 李四 电影
2 李四 读书
2 李四 音乐
2 李四 美食
hive>select hobby,count(*) as c1 from s1 lateral view explode(likes) likes as hobby group by hobby order by c1 desc;
读书 2
音乐 1
足球 1
美食 1
篮球 1
电影 1
汽车 1
喝茶 1
2) map 是一组键值对元组集合,使用数组表示,可以访问元素
map01('first','max','second','demo')
map01['first'] --'max'
array01[90,80,95] -->语 数 英
map01[key:value]-->['语':90,'数':80,'英':95]
类型 ----> string:int
create table s2(
id int,
name string,
deductons map<string,string>
)
row format delimited fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
lines terminated by '\n';
s2.txt
1,leo,英语:四级-日语:三级
2,marry,英语:六组-俄语:一级
load data local inpath '/home/hyxy/Desktop/s2.txt' overwrite into table s2;
select * from s2;
1 leo {"英语":"四级","日语":"三级"}
2 marry {"英语":"六组","俄语":"一级"}
查看英语是四级的学员信息
select * from s2 where deductons["英语"]="四级";
1 leo {"英语":"四级","日语":"三级"}
查看日语 级别
select deductons["日语"] from s2;
OK
三级
NULL
explode 拆分显示map集合(key 一列, value一列)
select explode(deductons) as (note_name,note_level) from s2;
OK
英语 四级
日语 三级
英语 六组
俄语 一级
lateral view explode 聚合函数显示:
select id,name,note_name,note_level from s2 lateral view explode(deductons) deductons as note_name,note_level;
OK
1 leo 英语 四级
1 leo 日语 三级
2 marry 英语 六组
2 marry 俄语 一级
3)STRUCT,和C语言中的struct类似,都可以通过"点" 符号访问元素内容
如:某列的数据类型 struct{班级 string,学号 int}
这列存放如下一行数据:{'10班',11001}
列名.班级 --> '10班'
struct是针对一组数