又很多小伙伴对于行转列和列转行搞不清楚,接下来我就跟大家举个例子分析一下行转列和列转行的区别
我们可以简单这样理解一个表如果行多了就会变得很高,很瘦,如果列多了就会变得很矮很胖,
所谓行转列就是由瘦高转向矮胖横向发展会用到concat()拼接函数和collect()收集函数两个函数案例就是行转列,
而列和转行就是由矮胖转向瘦高纵向发展会用到explode()炸裂和 lateral view 函数
数据:
name constellation blood_type
孙悟空 白羊座 A
娜娜 射手座 A
宋宋 白羊座 B
猪八戒 白羊座 A
凤姐 射手座 A
需求:
把星座和血型一样的人归类到一起
答案:
select
t1.base,
concat_ws('|', collect_set(t1.name)) name
from
(select
name,
concat(constellation, ",", blood_type) base
from
person) t1
group by
t1.base
表格实现:
射手座,A 娜娜|凤姐
白羊座,A 孙悟空|猪八戒
白羊座,B 宋宋
知识点:
1.利用concat()的参数一分隔符,这个函数,合并多个字符串
2.利用collect()的参数都是列名
数据:
movie category
《疑犯追踪》 悬疑,动作,科幻,剧情
《Lie to me》 悬疑,警匪,动作,心理,剧情
《战狼2》 战争,动作,灾难
需求
将电影分类中的数组数据展开。结果如下:
《疑犯追踪》 悬疑
《疑犯追踪》 动作
《疑犯追踪》 科幻
《疑犯追踪》 剧情
《Lie to me》 悬疑
《Lie to me》 警匪
《Lie to me》 动作
《Lie to me》 心理
《Lie to me》 剧情
《战狼2》 战争
《战狼2》 动作
《战狼2》 灾难
答案:
1.)将数据炸开用explode(装复杂数组的列名)函数炸裂!
select
explode (category)
from mov;
2.)用lateral view隐藏的拼接条件将炸开的数据连接(他自己会知道他自己是一行的)
select
movie,ty
from mov
lateral view explode(category) t as ty;
表格实现
《疑犯追踪》 悬疑
《疑犯追踪》 动作
《疑犯追踪》 科幻
《疑犯追踪》 剧情
《Lie to me》 悬疑
《Lie to me》 警匪
《Lie to me》 动作
《Lie to me》 心理
《Lie to me》 剧情
《战狼2》 战争
《战狼2》 动作
《战狼2》 灾难