Hive常用函数

行转列列转行

1:行转列
将多行的数据合并到一列中

 select collect_list(empname ) from emp; --去重
 select collect_set(deptno) from emp;

这两个都是聚合函数 将收集的多行数据聚集成一个数组集合
2:concat 拼接 参数是可变参数 拼接字符串

 select concat(deptno,empno) from emp;

3:concat_ws 参数一 拼接符 参数二 可变个数的字符串 数组

select concat_ws('|',empname,job) from emp;

4:列转行
①:explode 炸裂函数将数组或map中的每一个元炸裂放到每一行中去
②:split切割 按照指定切割符切割

 select explode(split(categorys,',')) from tb_movie2;

5:侧窗口函数 类似隐式 join lateral view

select name,tp from tb_movie2 lateral view explode(split(categorys,',')) t as tp;

t是表明 tp 是虚拟表的字段名

窗口函数

1.相关函数说明
OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化
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):往前第n行数据 lag 参数一 字段 n
LEAD(col,n):往后第n行数据 lead
NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。 ntile(5)

指定聚合函数的执行范围 又可以操作聚合函数之前的数据
①:指定窗口范围 、窗口大小

 select *, count(9) over() --指定窗口函数的范围是整个表
  from tb_orders;
 select * ,count(9) over(partition by name) --指定窗口大小是一个人(name)
  from tb_orders;

②:求起始到当前行的累加数据 可以看出数据的变化趋势

select *,
sum(money) over (partition by name rows between unbounded preceding and current row ) 
from tb_orders;
select *,
sum(money) over (partition by name order by ctime) --起始行到当前行
 from tb_orders;

Hive常用函数
上一行到这行的累加

 select *,
 sum(money) over (partition by name order by ctime rows between 1 preceding and current row)
  from tb_orders;

上一行加到下一行

select *,
sum(money) over (partition by name order by ctime rows between 1 preceding and 1 following)
 from tb_orders;

LAG(col,n):往前第n行数据

select * ,
lag(ctime,1) over(partition by name order by ctime)--返回前一条数据
 from tb_orders;

LAG(col,n,默认值):往前第n行数据,如果没有数据则返回默认值

select * ,
lag(ctime,1,'00000') over(partition by name order by ctime)--返回前一条数据如果没有则给一个默认值
from tb_orders;

查前百分之20的订单数据

select name,ctime,money 
from (select * ,ntile(5) over(order by ctime) num from tb_orders ) t where num=1;
上一篇:django 缓存的使用


下一篇:接口加密思路