Hive(30):行转列和列转行操作

一、实现功能

数据分析中常见的行转列和列转行的实例

二、行转列

1.相关函数说明

(1)CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;
(2)CONCAT_WS(separator, str1, str2,...):第一个参数剩 余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
(3)COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生 array 类型字段。

2.需求

把星座和血型一样的人归类到一起。结果如下:

p.base  name
射手座,A        大海|凤姐
白羊座,A        孙悟空|猪八戒
白羊座,B        宋宋

3.创建本地 constellation.txt,导入数据

[root@hadoop data-hive]# pwd
/opt/datas/data-hive
[root@hadoop data-hive]# vi constellation.txt

孙悟空  白羊座  A
大海    射手座  A
宋宋    白羊座  B
猪八戒  白羊座  A
凤姐    射手座  A

4.创建 hive 表并导入数据

create table person_info(
name string, 
constellation string, 
blood_type string) 
row format delimited fields terminated by "\t";

load data local inpath "/opt/datas/data-hive/constellation.txt" into table person_info;

查询结果:

hive (test)> select * from person_info;
OK
person_info.name        person_info.constellation       person_info.blood_type
孙悟空  白羊座  A
大海    射手座  A
宋宋    白羊座  B
猪八戒  白羊座  A
凤姐    射手座  A
Time taken: 0.227 seconds, Fetched: 5 row(s)

5.按需求查询数据

 select p.base,concat_ws('|',collect_set(p.name)) name from
 (select name,concat(constellation, ",", blood_type) base from person_info) p
 group by p.base;
结果:
p.base  name
射手座,A        大海|凤姐
白羊座,A        孙悟空|猪八戒
白羊座,B        宋宋

 三、列转行

1.函数说明 

(1)EXPLODE(col):将 hive 一列中复杂的 array 或者 map 结构拆分成多行。
(2)LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和 split, explode 等 UDTF 一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

2.数据准备movie.txt

《疑犯追踪》    悬疑,动作,科幻,剧情
《Lie to me》    悬疑,警匪,动作,心理,剧情
《战狼 2》    战争,动作,灾难

3.需求

将电影分类中的数组数据展开。结果如下:

《疑犯追踪》 悬疑
《疑犯追踪》 动作
《疑犯追踪》 科幻
《疑犯追踪》 剧情 
《Lie to me》 悬疑
《Lie to me》 警匪
《Lie to me》 动作
《Lie to me》 心理
《Lie to me》 剧情
《战狼 2》 战争
《战狼 2》 动作
《战狼 2》 灾难 

4.创建本地 movie.txt,导入数据

[root@hadoop data-hive]# vi movie.txt
《疑犯追踪》    悬疑,动作,科幻,剧情
《Lie to me》   悬疑,警匪,动作,心理,剧情
《战狼 2》      战争,动作,灾难

5.创建 hive 表并导入数据

create table movie_info(
 movie string,
 category array<string>)
row format delimited fields terminated by "\t"
collection items terminated by ",";
load data local inpath "/opt/datas/data-hive/movie.txt" into table movie_info;

6.按需求查询数据

hive (test)> select movie,category_name from movie_info lateral view explode(category) temp as category_name;
OK
movie   category_name
《疑犯追踪》    悬疑
《疑犯追踪》    动作
《疑犯追踪》    科幻
《疑犯追踪》    剧情
《Lie to me》   悬疑
《Lie to me》   警匪
《Lie to me》   动作
《Lie to me》   心理
《Lie to me》   剧情
《战狼 2》      战争
《战狼 2》      动作
《战狼 2》      灾难
Time taken: 0.116 seconds, Fetched: 12 row(s)

四、参考

1.https://blog.csdn.net/bsf5521/article/details/76576180

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值