行转列

1.相关函数说明
collect_list(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行不去重汇总,产生array类型字段,将多行数据转成一行一列存储在数组中.
collect_set(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段,将多行数据转成一行一列存储在数组中.

2.数据准备
name constellation blood_type
孙悟空 白羊座 A
娜娜 射手座 A
宋宋 白羊座 B
猪八戒 白羊座 A
凤姐 射手座 A

3.需求
把星座和血型一样的人归类到一起。结果如下:
射手座,A 娜娜|凤姐
白羊座,A 孙悟空|猪八戒
白羊座,B 宋宋
4.创建本地constellation.txt,导入数据
[doit@hadoop102 datas]$ vi constellation.txt
孙悟空 白羊座 A
娜娜 射手座 A
宋宋 白羊座 B
猪八戒 白羊座 A
凤姐 射手座 A
5.创建hive表并导入数据

create table person_info(
name string, 
constellation string, 
blood_type string) 
row format delimited fields terminated by "\t";
load data local inpath “/opt/module/datas/person_info.txt” into table person_info;

6.按需求查询数据

select
    t1.base,
    concat_ws('|', collect_set(t1.name)) name
from
    (select
        name,
        concat(constellation, ",", blood_type) base
    from
        person_info) t1
group by
t1.base;

7 练习
求teacher表中的每组人的总人数 , 男女人数 和每组人名单

select 
id ,
count(name) tatol,
sum(case sex when '男' then 1 else 0 end) nan ,
sum(case sex when '女' then 1 else 0 end) nv ,
concat_ws("|",collect_set(name))  name
from 
teacher 
group by id ;

+-----+--------+------+-----+-----------+--+
| id  | tatol  | nan  | nv  |   name    |
+-----+--------+------+-----+-----------+--+----------- |
| B   | 3      | 1    | 2   | 宋宋|婷姐|婷婷  |
| A   | 3      | 2    | 1   | 悟空|娜娜|凤姐  |
+-----+--------+------+-----+-----------+--+---------- |

列转行

1.函数说明
EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。 [爆炸, 炸裂]
LATERAL VIEW
一入多出
用法:LATERAL VIEW udtf(expression) table Alias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
2.数据准备
movie category
《疑犯追踪》 悬疑,动作,科幻,剧情
《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,导入数据
[doit@hadoop102 datas]$ vi movie.txt
《疑犯追踪》 悬疑,动作,科幻,剧情
《Lie to me》 悬疑,警匪,动作,心理,剧情
《战狼2》 战争,动作,灾难
5.创建hive表并导入数据

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

6.按需求查询数据

select
    movie,
    category_name
from 
movie_info lateral view explode(category) table_tmp as category_name;
--explode(category)将category数组炸开,相当于生成了一个新的表
--lateral view相当于join连接另一个表explode(category)
--table_tmp给新的表起的表名,语法要求格式,不可省略
--category_name新生成的字段名