Hive之函数
Hive之函数
第一节:内置函数
一、显示内置函数列表
show functions;
默认271个
二、查看函数的基本使用
desc function funname;
desc function max;
三、查看函数的详细使用教程
desc function extended funname;
desc function extended max;
四、函数分类
1、UDF
USER DEFINE FUNCTION 用户定义函数,进一路出一路
2、UDAF
USER DEFINE aggregate FUNCTION 用户定义聚合函数,进多路出一路
3、UDTF
USER DEFINE table FUNCTION 用户定义表函数,进一路出多路
explode 炸裂
第二节:常用函数之数值
一、ceil
向上取整
ceil(x) 大于等于参数的第一个整数
二、floor
向下取整
floor(x) 小于等于参数的第一个整数
三、round
round(x[, d]) 参数1 需要四舍五入的数 参数2:小数位数
select round(3.556789);
select round(3.556789,2);
四、rand
求随机数 0-1
rand([seed]) 参数:随机数种子,种子一样的,随机数固定的。
一般使用无参的select rand();
第二节:常用函数之字符串
一、简介
hive中的字符串,下标1开始的,字符串从右向左标记-1开始的。
二、split
split(str, regex) 参数1 字符串 参数2 切分的分隔符
select split("a,b,c,d",","); 返回值 数组类型
三、instr
instr(str, substr) 参数1:原始字符串,参数2:需要查找的子字符串
返回子字符串在原始字符串中第一次出现的位置,不存在 0
select instr("hello word","wo");
select instr("hello word","ww");
四、大小写
ucase 大写
lcase 小写
upper 大写
lower 小写
ucase(str)
五、字符串切分
substr
substring
substr(str, pos[, len]) 参数1 字符串 参数2 位置 参数3 截取长度
六、去空格
trim(str) 去前后空格
ltrim(str) 去前空格
rtrim(str) 去后空格
七、拼接
concat(str1, str2, ... strN) 将参数拼接为一个字符串
concat_ws(分隔符,str1,str2....) 按照一定的分隔符,拼接字符串的
八、字符串长度
length 返回字符串长度
第三节:常用函数之日期
一、获取当前系统时间戳
current_timestamp()
select current_timestamp(); 日期 时间
current_date
select current_date(); 获取当前系统的日期的
二、时间戳->日期
from_unixtime
from_unixtime(unix_time, format) 参数1 时间戳 参数2 日期格式
select from_unixtime(1558281600,"yyyy-MM-dd hh:mm:ss");
时间戳转成日期,其中时间戳必须是整形。
三、日期->时间戳
unix_timestamp(date[, pattern]) 参数1 日志 参数2 参数1的表达式
select unix_timestamp("2019-5-20 17:27:56","yyyy-MM-dd hh:mm:ss");
四、时间提取
year 年
month 月
day
hour
minute
second
select year("2019-3-4");
五、其他
to_date:返回日期
date_add:当前日期加几天
date_sub:当前日期 减几天
day:当前日期的号
month:当前日期是几月份
year:当前日期是哪一年
2018-6-30
weekofyear:给定的日期的周数
第四节:常用函数之类型转换
cast(原始数据 as 需要转换的类型)
cast(age as bigint)
第五节:常用函数之条件判断
一、if
if(判断,返回值1,返回值2);
类似java中的三元运算符
二、nvl
nvl(需要判断的字段,参数1为null的返回值);
用于处理null值
三、coalesce
coalesce;
返回第一个不为null的值
第六节:常用函数之炸裂函数
一、简介
explode:炸裂函数,将数组或map集合进行炸裂。
数组或map集合中的每一个元素为一行[1,2,3,4]{a:1,b:2}
对于数组每个元素只有一个,炸裂的结果只有一列,对于map每个元素有k-v 炸裂出来的结果2列。
二、单独使用
作为查询的参数
第七节:常用函数之窗口函数
一、概念
hive中提供的,运用一定的语法,可以按照我们的用户需求,将表中的数据分成多个独立的部分,每一个部分都是单独执行的,每一个部分数据称为一个窗口,每一个窗口内部的逻辑只执行当前窗口的数据,不会垮窗口执行数据。
开窗函数一般和其他的功能性函数一起使用,在都出开窗的那一字段。
在over子句中可以只给排序,默认只有一个窗口。
二、over子句
1、简介
over子句用于指定开窗的,每一个“窗口”依据。一般情况下,指定的每一个窗口按照某一个字段相同的数据放在每一个窗口中。
over(指定开窗依据的字段 指定每一个窗口内的排序规则)
2、开窗依据
必须要指定的。
一旦指定开窗依据的字段,就会将相同的字段值,放在一个窗口中。
语法:
distribute by 字段名
partition by 字段名
3、排序规则
可以指定,也可以不指定。
语法:
sort by --- distribute by
order by --- partition by
4、总结
over(partition by ...order by ..)
over(distribute by ....sort by )
over子句(开窗)不能单独使用,需要配合一些功能性的函数一起使用。
三、配合聚合函数
1、简介
max(字段) | sum(字段) + over子句,根据over子句指定的开窗规则,进行求每一个窗口内部的最大值 | 总和。
一般用于利润累计,目前最大值等
四、分组求topN
1、简介
rank|dense_rank 添加排名的,每个开窗内部,添加排名的
row_number添加行号的,1开始的