HQL中实现行列转换
其实并不用纠结哪个是行转列、哪个是列转行,明白二者之间的需求即可
行转列
数据、建表如下:
孙悟空 白羊座 A
大海 射手座 A
宋宋 白羊座 B
猪八戒 白羊座 A
凤姐 射手座 A
小明 白羊座 B
create table person_info(
name string,
constellation string,
blood_type string)
row format delimited fields terminated by "\t";
需求如下:
把星座和血型一样的人归类到一起
射手座,A 大海|凤姐
白羊座,A 孙悟空|猪八戒
白羊座,B 宋宋|小明
分析:
- 先用concat_ws函数将将星座和血型用“,”连接
- 在根据连接好的星座和血型group by
- 用collect_set函数对name聚合,
- 用concat_ws函数对聚合后的name用“|”分割
实现如下:
SELECT
t1.c_b,
CONCAT_WS("|",collect_set(t1.name))
FROM (
SELECT
NAME,
CONCAT_WS(',',constellation,blood_type) c_b
FROM person_info
)t1
GROUP BY t1.c_b
列转行
数据、建表如下:
《疑犯追踪》 悬疑,动作,科幻,剧情
《Lie to me》 悬疑,警匪,动作,心理,剧情
《战狼 2》 战争,动作,灾难
create table movie_info(
movie string,
category string)
row format delimited fields terminated by "\t";
需求如下:
将电影分类中的数组数据展开
《疑犯追踪》 悬疑
《疑犯追踪》 动作
《疑犯追踪》 科幻
《疑犯追踪》 剧情
《Lie to me》 悬疑
《Lie to me》 警匪
《Lie to me》 动作
《Lie to me》 心理
《Lie to me》 剧情
《战狼 2》 战争
《战狼 2》 动作
《战狼 2》 灾难
分析:
- 先用split函数将category根据“,”分割成数组
- lateral view结合explode函数进行炸裂后的侧写
实现如下:
SELECT
movie,
category_name
FROM
movie_info
lateral VIEW
explode(split(category,",")) movie_info_tmp AS category_name;