/**
列转行,collect_list 或 collect_set
collect_list: 有序,但不去重
collect_set: 无序,但去重
*/
select
col1,
col2,
collect_list(col3) --collect_list是有序但不去重,collect_set是无序但去重(如果需要排序,可以通过sort_array通过排序,如果需要指定拼接符可以通过concat_ws来操作,转换字符串通过cast来操作)
from tb group col1,col2;
/**
行转列,爆炸函数(炸裂函数): explode
*/
select
explode(col) col
from tb; --这个只是炸开然后是多行数据,但是其他字段没办法展示
//如果需要展示其他列,就需要通过lateral view(侧视图来完成,lateral view相当于记录了这个explode炸开后的信息,然后其他列就可以找到炸开后的信息了)
select
a.col1,
a.col2,
b.col3
from tb a lateral view explode(split(col3,",")) b as col3;
//解释说明:a是tb表的别名,b是侧视图lateral view的名称,末尾的col3是炸裂后的列名
//explode,可以炸开array,map
//select explode(`array`(1, 2, 5, 3, 5, 6, 3, 4, 5, 7));
//select explode(map("name","zhangsan","age",12));
面试经典案列-----行列转换
最新推荐文章于 2024-07-08 14:58:49 发布