Hive 行转列、列转行

Hive 行转列、列转行,第1张

Hive 行转列、列转行 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;

["悬疑","动作","科幻","剧情"]
["战争","动作","灾难"]

到此,我们的行转列、列转行已经完成统计

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5679049.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存