Hive行列之间的转换
行转列
数据说明:
# 原数据格式
《疑犯追踪》 悬疑
《疑犯追踪》 动作
《疑犯追踪》 科幻
《疑犯追踪》 剧情
《战狼2》 战争
《战狼2》 动作
《战狼2》 灾难
# 转换后数据格式
《疑犯追踪》 悬疑,动作,科幻,剧情
《战狼2》 战争,动作,灾难
- 创建表
drop table movie_info;
create table movie_info(
movie string,
category string)
row format delimited fields terminated by " "
;
- 加载表数据
load data local inpath "/opt/data/zj/movie.txt" into table movie_info;
- 实现方式
-- 数据格式
select movie,concat_ws(',',collect_set(category)) name from movie_info group by movie;
先将需要聚合的字段,存放到一个集合中,然后再通过 “,” 相互链接
- 函数说明:
collect_set: 具有去重操作
collect_list:不去重
concat_ws:字符串的拼接
列转行
# 原数据格式
《疑犯追踪》 悬疑,动作,科幻,剧情
《战狼2》 战争,动作,灾难
# 转换后数据格式
《疑犯追踪》 悬疑
《疑犯追踪》 动作
《疑犯追踪》 科幻
《疑犯追踪》 剧情
《战狼2》 战争
《战狼2》 动作
《战狼2》 灾难
- 创建表
drop table movie_info;
create table movie_info(
movie string,
category string)
row format delimited fields terminated by " "
-- collection items terminated by "," -- 指定Array、Map类型数据的分割符
;
- 加载表数据
load data local inpath "/opt/data/zj/movie.txt" into table movie_info;
- 实现方式
-- explode() 函数只支持:Array类型数据 与 Map类型数据,其余数据类型不支持
select
movie,
category_name
from
movie_info lateral view explode(split(regexp_extract(concat('\[\"',category,'\"\]'),'^\\["(.*)\\"]$',1),',')) table_tmp as category_name;
hive的列转行是稍微比较难理解,列转行需要使用explode函数,但是,该函数只支持Array类型数据或者map类型的数据,不支持string和int类型数据,这就需要我们将该类型强制转换。
String类型转换为Array类型:
select split(regexp_extract(concat('\[\"',category,'\"\]'),'^\\["(.*)\\"]$',1),',') from movie_info;
["悬疑","动作","科幻","剧情"]
["战争","动作","灾难"]
到此,我们的行转列、列转行已经完成统计