数据:
movie_info.txt
《疑犯追踪》 悬疑,动作,科幻,剧情
《Lie to me》 悬疑,警匪,动作,心理,剧情
《战狼2》 战争,动作,灾难
建表:
0: jdbc:hive2://hadoop:11240> create table movie_info(movie string,category array<string>)
. . . . . . . . . . . . . . > row format delimited fields terminated by '\t'
. . . . . . . . . . . . . . > collection items terminated by ',';
0: jdbc:hive2://hadoop:11240> load data local inpath "/home/xiaokang/hivedata/movie_info.txt"
. . . . . . . . . . . . . . > into table movie_info;
0: jdbc:hive2://hadoop:11240> select * from movie_info;
+-------------------+-----------------------------+
| movie_info.movie | movie_info.category |
+-------------------+-----------------------------+
| 《疑犯追踪》 | ["悬疑","动作","科幻","剧情"] |
| 《Lie to me》 | ["悬疑","警匪","动作","心理","剧情"] |
| 《战狼2》 | ["战争","动作","灾难"] |
+-------------------+-----------------------------+
需求:将电影分类中的数组数据展开
函数说明:
explode(col):将hive一列中复杂的array或者map结构拆分成多行
0: jdbc:hive2://hadoop:11240> select explode(category) from movie_info;
+------+
| col |
+------+
| 悬疑 |
| 动作 |
| 科幻 |
| 剧情 |
| 悬疑 |
| 警匪 |
| 动作 |
| 心理 |
| 剧情 |
| 战争 |
| 动作 |
| 灾难 |
+------+
lateral view 侧写
用法:lateral view udtf(expression) tableAlias as columnAlias
解释:用于和 split, explode 等 udtf 一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合
查询:
0: jdbc:hive2://hadoop:11240> select movie,category_name
. . . . . . . . . . . . . . > from movie_info
. . . . . . . . . . . . . . > lateral view explode(category) table_tmp as category_name;
+--------------+----------------+
| movie | category_name |
+--------------+----------------+
| 《疑犯追踪》 | 悬疑 |
| 《疑犯追踪》 | 动作 |
| 《疑犯追踪》 | 科幻 |
| 《疑犯追踪》 | 剧情 |
| 《Lie to me》 | 悬疑 |
| 《Lie to me》 | 警匪 |
| 《Lie to me》 | 动作 |
| 《Lie to me》 | 心理 |
| 《Lie to me》 | 剧情 |
| 《战狼2》 | 战争 |
| 《战狼2》 | 动作 |
| 《战狼2》 | 灾难 |
+--------------+----------------+