常用的算子:
explode(),posexplode(),lateral view
含义:将一个融合多个信息的字段拆分成一列(多行),简单理解为一行数据变多行数据。
举例:
结果展示:aaa,bbb,ccc
===>
aaa
bbb
ccc
步骤:先用split切开按照,进行分隔成数组的形式 ["aaa","bbb","ccc"]
然后再用explode函数炸开,将一行分成多行
具体实现:
select explode(split('aaa,bbb,ccc',','));
含义:将一个融合多个信息的字段拆分成多行并将转换后的多行信息与原表字段关联查询
lateral view侧视图即产生一张虚拟表
举例:
结果展示:
name hobbys
tom 唱歌,跳舞,弹琴
jack 唱歌,绘画,打篮球
======>
name hobby
tom 唱歌
tom 跳舞
tom 弹琴
jack 唱歌
jack 绘画
jack 打篮球
步骤:
//此语句本身返回的就是一张虚拟表 记为temp 可以为temp表的列指定字段名hobby
explode(split(hobby,',')) temp as hobby
//使用later view可以直接关联两张表,保持原有映射关系
student lateral view temp
具体实现:
select student.name,temp.hobby from student lateral view explode(split(hobbys,',')) temp as hobby;
常用的算子:
sum(),count(),max(),min(),collect_set(),collect_list()
含义:将一列(多行)数据融合为一行,简单理解为多行数据变一行数据。
举例:
结果演示:
name hobby
tom 唱歌
tom 跳舞
tom 弹琴
jack 唱歌
jack 绘画
jack 打篮球
======>
name hobbys
tom 唱歌,跳舞,弹琴
jack 唱歌,绘画,打篮球
实现步骤:
据name字段进行分组,在每个分组内部name是唯一的可以直接查询,hobby字段就可以使用collect_set与concat_ws进行连接为复合字段。
具体实现:
select name,concat_ws(’,’,collect_set(hobby)) as hobbys from stu group by name;