explode的作用
将一行集合类型的数据炸裂为多行数据。
格式
lateral view explode(字段) 表别名 as 列别名
如果字段类型是map:lateral view explode(字段) 表别名 as key别名,value别名
示例
有如下表数据
+-------------------+----------------------+
| movie_info.movie | movie_info.category |
+-------------------+----------------------+
| 《疑犯追踪》 | 悬疑,动作,科幻,剧情 |
| 《Lie to me》 | 悬疑,警匪,动作,心理,剧情 |
| 《战狼2》 | 战争,动作,灾难 |
+-------------------+----------------------+
想要的结果:
+--------------+-----------+
| m.movie | tbl.type |
+--------------+-----------+
| 《疑犯追踪》 | 悬疑 |
| 《疑犯追踪》 | 动作 |
| 《疑犯追踪》 | 科幻 |
| 《疑犯追踪》 | 剧情 |
| 《Lie to me》 | 悬疑 |
| 《Lie to me》 | 警匪 |
| 《Lie to me》 | 动作 |
| 《Lie to me》 | 心理 |
| 《Lie to me》 | 剧情 |
| 《战狼2》 | 战争 |
| 《战狼2》 | 动作 |
| 《战狼2》 | 灾难 |
+--------------+-----------+
select movie,tbl.type
from movie_info
lateral view explode(split(category,',')) tbl as type;
如果想要如下结果:
+-----------+-----------------------------------+
| tbl.type | _c1 |
+-----------+-----------------------------------+
| 剧情 | ["《疑犯追踪》","《Lie to me》"] |
| 动作 | ["《疑犯追踪》","《Lie to me》","《战狼2》"] |
| 心理 | ["《Lie to me》"] |
| 悬疑 | ["《疑犯追踪》","《Lie to me》"] |
| 战争 | ["《战狼2》"] |
| 灾难 | ["《战狼2》"] |
| 科幻 | ["《疑犯追踪》"] |
| 警匪 | ["《Lie to me》"] |
+-----------+-----------------------------------+
这个是列转行的实现,我们可以按照类型分组,然后把电影名放在集合中。
select tbl.type,collect_list(movie)
from movie_info
lateral view explode(split(category,',')) tbl as type
group by tbl.type;