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;

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值