数据说明:
# 原数据格式 《疑犯追踪》 悬疑 《疑犯追踪》 动作 《疑犯追踪》 科幻 《疑犯追踪》 剧情 《战狼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; ["悬疑","动作","科幻","剧情"] ["战争","动作","灾难"]
到此,我们的行转列、列转行已经完成统计
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)