Hive-行转列,列转行
collect_set () – 去重collect_list (split(str)) 这两个都是聚合函数 将收集的多行数据聚集成一个数组集合
concat (串,符,串。。。。。)拼接 参数是可变参数 拼接字符串
concat_ws(符,数组/map) 参数一 拼接符 参数二 可变个数的字符串 数组 数据:
建表:
按星座和血型分组,并用concat()将姓名拼接:
结果:
±-------±----------------+
| _c0 | _c1 |
±-------±----------------+
| 处女座,B | [“慧慧”,“奔奔”] |
| 射手座,A | [“老娜”,“taoge”] |
| 白羊座,A | [“gangge”] |
±-------±----------------+
用concat_ws()将拼接得到的数组变成字符串,以此实现姓名从列到行的转换;
数据:
《八佰》 战争
《八佰》 动作
《八佰》 抗日
《八佰》 剧情
《姜子牙》 动画
《姜子牙》 神话
《姜子牙》 科幻
《姜子牙》 动作
《姜子牙》 伦理
《战狼2》 战争
《战狼2》 动作
《战狼2》 灾难
建表:
按电影名分组,并将电影类型从列转行拼接在一起,起个别名categorys
结果:
±-------±----------------+
| name | categorys |
±-------±----------------+
| 《八佰》 | 战争,动作,抗日,剧情 |
| 《姜子牙》 | 动画,神话,科幻,动作,伦理 |
| 《战狼2》 | 战争,动作,灾难 |
±-------±----------------+
创建新表,将转换好的数据导入到新的表中得到基础数据,用以完成 行–> 列的操作
首先将行中电影属性切割存于数组用到split()函数
结果:
±-------±----------------------------+
| name | _c1 |
±-------±----------------------------+
| 《八佰》 | [“战争”,“动作”,“抗日”,“剧情”] |
| 《姜子牙》 | [“动画”,“神话”,“科幻”,“动作”,“伦理”] |
| 《战狼2》 | [“战争”,“动作”,“灾难”] |
±-------±----------------------------+
使用explode()函数完事数组炸裂,将属性categorys由数组–>一列 的操作
结果:
侧窗口函数 类似隐式 join 完成电影名和炸雷开的属性的拼接
转换
select
name ,
tp
from
tb_movie2
lateral view
explode(split(categorys , ‘,’)) t as tp ;-- t 表名 炸开的一列看成一个虚拟表, tp 虚拟表的字段名