2020-10-16-Hive-3(行列转换 窗口函数 行号函数 )

1.行转列

CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行/去重/汇总,产生array类型字段。 将某列数据转换成数组

create table tb_star
(
    name  varchar(10),
    star  varchar(10),
    dname varchar(10)

);
insert into tb_star
values ('孙悟空', '白羊座', 'A'),
       ('娜娜', '射手座', 'A '),
       ('宋宋', '白羊座', 'B'),
       ('猪八戒', '白羊座', 'A'),
       ('凤姐', '射手座', 'A');

#方法一
with x as (
select
concat(t1.star,',',t1.dname) as star_,
#concat_ws('|',t1.name)
t1.name
from
tb_star t1)
select
x.star_,
group_concat(  distinct  x.name  Separator '|')
from x
group by x.star_;

#方法二:
select
concat_ws(',', t1.dname, t1.star) name_,
group_concat(t1.name SEPARATOR '|')
from tb_star t1
group by t1.dname,t1.star
例题2
CREATE TABLE `StudentScores`
(
    `UserName` varchar(20) DEFAULT NULL,
    `Subject`  varchar(30) DEFAULT NULL,
    `Score`    float       DEFAULT NULL
)
    ENGINE = InnoDB
    DEFAULT CHARSET = utf8;

INSERT INTO StudentScores
SELECT 'Nick', '语文', 80;
INSERT INTO StudentScores
SELECT 'Nick', '数学', 90;
INSERT INTO StudentScores
SELECT 'Nick', '英语', 70;
INSERT INTO StudentScores
SELECT 'Nick', '生物', 85;
INSERT INTO StudentScores
SELECT 'Kent', '语文', 80;
INSERT INTO StudentScores
SELECT 'Kent', '数学', 90;
INSERT INTO StudentScores
SELECT 'Kent', '英语', 70;
INSERT INTO StudentScores
SELECT 'Kent', '生物', 85;

select *
from StudentScores;
#如果我想知道每位学生的每科成绩,而且每个学生的全部成绩排成一行

select t1.UserName,
##要使用聚合函数,因为分组了.......
       MAX(case t1.Subject when '语文' then t1.Score end) as '语文',
       MAX(case t1.Subject when '数学' then t1.Score end) as '数学',
       MAX(case t1.Subject when '英语' then t1.Score end) as '英语',
       MAX(case t1.Subject when '生物' then t1.Score end) as '生物'
from StudentScores t1
group by t1.UserName;

2.列转行
(hive中方法)-炸裂函数

select
name ,
f_type
from
tb_movie
lateral view 
explode(split(types ,",")) t  as f_type 

3.窗口函数

区别:
例如:
sum(target) over (partition by id order by time ) as sum_
sum(target) over (partition by id ) as sum_
sum(target) over (partition by id rows 2 preceding ) as sum_
sum(target) over(partition by id , substr(ctime , 0 , 7)) as sum_

OVER( partition by 字段 ,字段 order by rows between and ):指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化

CURRENT ROW:当前行 current row

n PRECEDING:往前n行数据 n preceding

n FOLLOWING:往后n行数据 n following

UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点,

UNBOUNDED FOLLOWING表示到后面的终点 unbound preceding unbound following

LAG(col,n, default):往前第n行数据 lag 参数一 字段 n

LEAD(col,n, default):往后第n行数据 lead

NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。 ntile(5)

4.行号函数

编号函数 对窗口中的数据进行编号 一般编号有排序

RANK() 排序相同时会重复,总数不会变

DENSE_RANK() 排序相同时会重复,总数会减少

ROW_NUMBER() 会根据顺序计算编号 不关注排序字段的值

你可能感兴趣的:(2020-10-16-Hive-3(行列转换 窗口函数 行号函数 ))