入门篇3-hive常用函数


欢迎大家交流学习

数学函数

1.round(Double a[,INT b])
四舍五入
round(11.54) 结果 12
round(11.541) 结果 11.5

2.floor(Double a)
向下取整
floor(10.9) 结果:10
floor(-10.9) 结果:-11

3.ceil(Double a)
向上取整
ceil(10.9) 结果:11
ceil(-10.9) 结果:-10

4.rand(INT seed) 
产生0-1的随机数,seed随机因子,可不传
rand() ...

5.abs()取绝对值

日期函数

--当前日期
current_date();
--当前天数
day(current_date());
--当前月份
month(current_date());
--当前年份
year(current_date());
--当前时间
current_timestamp();
--当前小时
hour(current_timestamp());
--当前时间戳long类型
unix_timestamp();

日期加减

--1.date_add/date_sub 加减天数
date_add(DATE startdate,INT days)
date_add(current_date(),2) --加两天
date_add(current_date(),-2) --减两天

date_sub(DATE startdate,INT days)
date_sub(current_date(),-2) --加两天
date_sub(current_date(),2) --减两天


--2.add_months
add_months(DATE|STRING|TIMESTAMP startdate,INT months)
add_months(current_date(),2) --加两个月
add_months(current_date(),-2) --减两个月

--3.年份
current_date() + INTERVAL 1 year --加一年
current_date() - INTERVAL 1 year --减一年


ps:interval函数

日期转换函数

1.date_format
date_format(DATE|STRING|TIMESTAMP date,String fmt)
date_format(current_date(),'y') --获取当前年
date_format(current_date(),'M') --获取当前月
date_format(current_date(),'d') --获取当前天
==两个MM/dd 日期格式会带0,否则不带0==
date_format(current_date(),'Y-MM-dd') --获取当前年月日
date_format(current_date(),'YMMdd') --获取当前年月日不带-
date_format(current_date(),'Y-MM') --获取当前年月
date_format(current_date(),'YM') --获取当前年月 不带- 不带0   


date_format(current_timestamp(),'yyyy-MM-dd'). --获取日期格式
date_format('2023-07-18 19:50:10','yyyy-MM-dd HH:mm:ss') --字符串转时间戳

2.to_date()
to_date(current_timestamp()) --时间戳转日期

3.unix_timestamp()
unix_timestamp(current_timestamp()) --时间戳转long类型

4.from_unixtime()
转换unix时间戳为日期类型
from_unixtime(unix_timestamp(),'yyyy-MM-dd')

5.trunc()
trunc 截取日期
--本年1月1号
trunc(current_date(),'YEAR')  
trunc(current_date(),'YY') 
trunc(current_date(),'YYYY') 

--本月1号
trunc(current_date(),'MONTH')
trunc(current_date(),'MON')
trunc(current_date(),'MM')

日期差

1.datediff()获取相差的天数,前面减后面
datediff(current_date(),'2023-07-18') 

2.month_between(DATE|STRING|TIMESTAMP date1,DATE|STRING|TIMESTAMP date2) 获取相差的月份,前减后
month_between(current_date,'2023-07-18')

3.unix时间戳方式
(unix_timestamp(date1)-unix_timestamp(date2)) --相差的秒数
(unix_timestamp(date1)-unix_timestamp(date2))/60 --相差分钟数
...
...
...

字符串函数

字符串截取

1.split(String str,String pat),返回值是Array
按照pat去分割str
split("898978800","7")
结果:["8989","8800"]

2.substr(String|Binary a, INT start[,INT len]),返回值字符串
从start位置开始截取字符串,len截取长度,不写默认截取到末尾
substr("89757",1,2)
结果:89
substr("89757",3)
结果:757

字符串替换

replace(String a,String old,String new)
replace("7899","7","88")
结果:88899

字符串拼接

translate(String a,String old,String new) 
ps:测试只能替换new的长度要小于等于old,超出长度不会替换
eg:translate("889988","99","777")
结果:887788

collect_list(列名) 按照查询维度进行列转行,返回数组
collect_set(列名) 按照查询维度进行列转行,并去重,返回数组

聚合函数

count(列名) 按照查询维度统计个数
max(列名) 按照查询维度求最大值
sum(列名) 按照查询维度求和
min(列名) 按照查询维度求最小值
avg(列名) 按照查询维度求平均值

开窗函数

开窗函数不能和order by 一起使用,在全量的数据范围中,再划分出一个范围,按照划分的范围去统计数据,比如求一笔订单中,每个订单与最高订单价格的差额等等
功能:按照partition by的列做分组,然后在进行计算

sum(列名)over(partition by 列名 order by 列名)order by 会按照分组后按照排序列求累计值
max(列名)over(partition by 列名 order by 列名) 
min(列名)over(partition by 列名 order by 列名)

数据:20 20 30 50 60 (升序排列)
row_number()over(partition by 列名 order by 列名) 分组排序
结果:1 2 3 4 5
rank()over(partition by 列名 order by 列名)
结果: 1 1 3 4 5
dense_rank()over(partition by 列名 order by 列名)
结果:1 1 2 3 4 

......

集合函数

1.size(Map<K,V>|Array<T> a) 返回包含元素的个数
size(map("他",33,"她",44)) 结果:2 
size(array(1,2,3,4,5,6)) 结果:6

2.map_keys()
获取map的键值,返回数组
map_keys(map("他",33,"她",44)) 结果:["他","她"]

3.map_values()
获取map的值,返回数组
map_values(map("他",33,"她",44)) 结果:[33,33]

5.array_contains(array<T>,val)
判断数组是否包含val,返回boolean值
array_contains(array(1,2,3,4,5,6),6) 结果:true

6.sort_array()
对数组进行排序
sort_array(array(5,3,2,4,1)) 结果:12345

爆炸函数💣

explode(列名) 将map、数组拆分成多行,使用爆炸函数之后不能在使用其他的列,所以一般配合侧视图(lateral view)使用

eg:mans
------|----------
age	  |  name		
------|----------
20["小明","小刚","小狗"]
21["小月","小鬼","大鬼"]
------------------
select age,name.value from 
mans 
lateral view explode(name) name as value;

结果:
------|----------
age	  |  name		
------|----------
20	  | 小明
20	  | 小刚
20	  | 小狗
21    | 小月
21	  | 小鬼
21	  | 大鬼
------------------

其他

distinct 去重,慎用
order by 全局排序,慎用
distribute by 分发数据,默认对分发列做hash,然后对reduce的个数取模,相同的分到一个reduce上
sort by 局部排序,一般配合distribute by 一起使用
cluster by 兼具distribute by 和 sort by 的功能,只能升序排列

regexp系列

1.regexp_extract

regexp_extract(String subject,String pattern,INT index)
按照pattern中的正则表达式返回结果,其中index代表pattern中分组的序号
ps:pattern中()表示一个分组,另外不是按照分组重新匹配,而是在匹配结果的基础上返回分组匹配到的数据
0:代表按照整个分组返回匹配结果
1:代表按照pattern中的第一个分组返回结果
2:代表按照pattern中的第二个分组返回结果
....
n:代表按照pattern中的第n个分组返回结果

eg:
01.select regexp_extract("小明去了姑姑家5天,five days...","([0-9].).(five)",0)
结果:5,five

02.select regexp_extract("小明去了姑姑家5天,five days...","([0-9].).(five)",1)
结果:503.select regexp_extract("小明去了姑姑家5天,five days...","([0-9].).(five)",2)
结果:five

2.regexp_replace

regexp_replace(String initial_string,String pattern,String replacement)
根据pattern中的表达式匹配结果,替换为replacement
eg:
01.select regexp_replace("小明去了姑姑家5天,five days...","[0-9]",10)
(把数字替换为10)
结果:小明去了姑姑家10,five days...

02.select regexp_replace("小明去了姑姑家5天,five days...","\\.*","")
(去除.)
结果:小明去了姑姑家5,five days

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值