【灵光一现】温故而知新-hive常用函数盘点

不得不说hive虽然走mr跑的很慢 要借助tez才能快点,但是它函数方面还是做的很好的呀
除了能udf,udtf,多近多出外还有一些函数大大方便了使用者的编写难度和查询效率
本篇文章就用来写一些做项目过程中发光发热的那些函数


1.collect_set()
能够查询分组情况下,将同一分组不同行的数据聚合在一起
比如

1
2
3
hive (gmall)> select course, collect_set(area), avg(score) from stud group by course;
chinese ["sh","bj"] 79.0
math ["bj"] 93.5

也可以用下标来将某一个取出来

1
2
3
hive (gmall)> select course, collect_set(area)[0], avg(score) from stud group by course;
chinese sh 79.0
math bj 93.5

2.日期处理函数

1)date_format函数(根据格式整理日期)

1
2
hive (gmall)> select date_format('2019-02-10','yyyy-MM');
2019-02

2)date_add函数(加减日期)

1
2
3
4
hive (gmall)> select date_add('2019-02-10',-1);
2019-02-09
hive (gmall)> select date_add('2019-02-10',1);
2019-02-11

3)next_day函数
(1)取当前天的下一个周二

1
2
3
hive (gmall)> select next_day('2020-03-19','TU');
OK
2020-03-24

说明:星期一到星期日的英文(Monday,Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday)
(2)取当前周的周二

1
2
3
hive (gmall)> select date_add(next_day('2020-03-19','TU'),-7);
OK
2020-03-17

4)last_day函数(求当月最后一天日期)

1
2
3
hive (gmall)> select last_day('2020-02-18');
OK
2020-02-29

3.行转列 concat_ws
有点类似于mysql中的concat字符串拼接函数
它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间
案例
如下表

1
2
3
4
5
6
7
8
select * from person_info
> ;
OK
孙悟空 白羊座 A
大海 射手座 A
宋宋 白羊座 B
猪八戒 白羊座 A
凤姐 射手座 A

将同血型同星座的人放一起

1
2
3
4
5
6
7
8
9
10
11
12
13
14
射手座,A	大海|凤姐
白羊座,A 孙悟空|猪八戒
白羊座,B 宋宋
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;

4.列转行explode()
EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。
LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
案例:
movie category
《疑犯追踪》 悬疑,动作,科幻,剧情
《Lie to me》 悬疑,警匪,动作,心理,剧情
《战狼2》 战争,动作,灾难
使用explode将其炸开,效果如下:
《疑犯追踪》 悬疑
《疑犯追踪》 动作
《疑犯追踪》 科幻
《疑犯追踪》 剧情
《Lie to me》 悬疑
《Lie to me》 警匪
《Lie to me》 动作
《Lie to me》 心理
《Lie to me》 剧情
《战狼2》 战争
《战狼2》 动作
《战狼2》 灾难

1
2
3
4
5
select
movie,
category_name
from
movie_info lateral view explode(category) table_tmp as category_name;

5.over()窗口函数(mysql中也有,不过没这么花里胡哨)
相关函数说明
OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化
CURRENT ROW:当前行
n PRECEDING:往前n行数据
n FOLLOWING:往后n行数据
UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点
LAG(col,n):往前第n行数据
LEAD(col,n):往后第n行数据
NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一 行,NTILE返回此行所属的组的编号。注意:n必须为int类型。
rank()系列:排名用
RANK() 排序相同时会重复,总数不会变
DENSE_RANK() 排序相同时会重复,总数会减少
ROW_NUMBER() 会根据顺序计算
开窗是个大环节,案例博主会单独开一篇文章介绍

×

纯属好玩

扫码支持
谢谢你

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
,