HIVE除了提供了类似mysql的sql的语法外,还提供了大量内置的函数,方便开发者来调用,编写功能丰富的处理程序。使用如下命令查看当前hive版本支持的所有内置函数。
show functions; 显示函数的描述信息:
DESC FUNCTION concat;显示函数的扩展描述信息:
DESC FUNCTION EXTENDED concat;下面我们对其中重要的,使用频率高的函数使用进行详细讲解。
1 字符串函数
主要针对字符串数据类型进行操作,比如下面这些:
1)字符串连接函数:concat
语法:concat(string A,stringB...)返回值:string。说明:返回输入字符串连接后的结果,支持任意个输入字符串举例:
|-------------------------------------------------------|
| hive> select concat(``'abc'``,``'def'``,``'gh'``) ;
|
执行结果:abcdefgh
2)带分隔符字符串连接函数:concat_ws
语法:concat_ws(string SEP,string A,string B...);返回值:string。说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符,举例:
|--------------------------------------------------------|
| hive> select concat_ws(``','``,``'def'``,``'gh'``) ;
|
执行结果:def,gh
3)小数位格式化成字符串函数:format_number
语法:format_number(number x,int d)返回值:string,说明:将数值的小数位格式化成d位,四舍五入举例:
|--------------------------------------------------|
| hive> select format_number(``5.23456``,``3``);
|
执行结果:5.235
4)字符串截取函数:substr,substring
语法:substr(string A,int start,int long),substring(string A, int start),返回值:string。说明:返回字符串A从start位置到结尾的字符串举例:
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| hive> select substr(``'abcde'``,``3``);
执行结果:cde
hive> select substring(``'abcde'``,``3``);
执行结果:cde
hive>select substr(``'abcde'``,-``1``) ;(和ORACLE相同)
执行结果:e
|
5)字符串查找函数: instr
语法:instr(string str, string substr),返回值:int。说明:返回字符串substr在str中首次出现的位置举例:
|----------------------------------------------|
| hive> select instr(``'abcdf'``,``'df'``) ;
|
执行结果:4
6)字串转换成map函数: str_to_map
语法:str_to_map(text[,delimiter1,delimiter2]),返回值:map<string,string>。说明:将字符串按照给定的分隔符转换成map结构举例:
|-------------------------------------------------------|
| hive> select str_to_map(``'k1:v1,k2:v2'``,``','``);
|
执行结果:{"k2":"v2","k1":"v1"}
7)字符串转大写函数:upper,ucase
语法:upper(string A)、ucase(stringA),返回值:string。说明:返回字符串A的大写格式举例:
|-------------------------------------------------------------------------------------------------|
| hive> select upper(``'abSEd'``);
执行结果:ABSED
hive> select ucase(``'abSEd'``);
执行结果:ABSED
|
8)字符串转小写函数:lower,lcase
语法:lower(string A) lcase(string A),返回值:string。说明:返回字符串A的小写格式举例:
|---------------------------------------------------------------------------------------------------|
| hive> select lower(``'abSEd'``) ;
执行结果:absed
hive> select lcase(``'abSEd'``) ;
执行结果:absed
|
9)正则表达式替换函数:regexp_replace
语法:regexp_replace(string A,string B,string C),返回值:string,说明:将字符串A中的符合iava正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。举例:
|-----------------------------------------------------------------|
| hive> select regexp_replace(``'foobar'``,``'oo|ar'``,``''``);
|
执行结果:fb
补充正则表达式的知识:
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 例如: runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。 runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。 colou?r,可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。 更多知识学习可以参考正则表达式 -- 语法 | 菜鸟教程 |
10)正则表达式解析函数:regexp_extract
语法:regexp_extract(string subject,string pattern,int index),返回值:string,说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。其中index的取值:
0是显示与之匹配的整个字符串、1 是显示第一个括号里面的字符串、2 是显示第二个括号里面的字符串
|--------------------------------------------------------------------------|
| hive>select regexp_extract(``'foothebar'``,``'foo(.*?)(bar)'``,``1``);
|
执行结果:the
11)分割字符串函数:split
语法:split(string str,stringpa t),返回值:array。说明:按照pat字符串分割str,会返回分割后的字符串数组举例:
|------------------------------------------------|
| hive> select split(``'abtcdtef'``,``'t'``) ;
|
执行结果:["ab","cd","ef"]
2 日期函数
1)获取当前UNIX时间函数:unix_timestamp
语法:unix_timestamp(),返回值:bigint。说明:获得当前时区的UNIX时间戳。时间戳是指(从1970-01-0100:00:00UTC到指定时间的秒数)到当前时区的时间格式,举例:
|----------------------------------|
| hive> select unix_timestamp();
|
执行结果:1323309615
2)日期转UNIX时间函数:unix_timestamp
语法:unix_timestamp(string date),返回值:bigint。说明:转换格式为"yyyy-MM-ddHH:mm:ss"的日期到UNIX时间戳。如果转化失败,则返回null。举例:
|---------------------------------------------------------|
| hive>select unix_timestamp(``'2011、1207 13:01:03'``);
|
执行结果:1323234063
3)指定格式日期转UNIX时间戳函数:unix_timestamp
语法:unix_timestamp(string date,string pattern),返回值:bigint。说明:转换pattern格式的日期到UNIX时间戳。如果转化失败,则返回null。举例:
|--------------------------------------------------------------------------------|
| hive>select unix_timestamp(``'20111207 13:01:03'``,``'yyyyMMdd HH:mm:ss'``);
|
执行结果:1323234063
4)UNIX时间戳转日期函数:from_unixtime
语法:from_unixtime(bigint unixtime[,string format]),返回值:string。说明:转化UNIX时间戳举例:
|--------------------------------------------------------------|
| hive> select from_unixtime(``1323337489``,``'yyyyMMdd'``);
|
执行结果:20111208
5)日期时间转日期函数:to_date
语法:to_date(string timestamp),返回值:string。说明:返回日期时间字段中的日期部分。举例:
|----------------------------------------------------|
| hive> select to_date(``'2021-12-23 10:03:01'``);
|
执行结果:2021-12-23
6)日期转年数:year
语法:year(string date),返回值:int。说明:返回日期中的年。举例:
|-----------------------------------------------------------------------------------------|
| hive> select year(``'2021-12-08 10:03:01'``);
hive> select year(``'2012-12-08'``) ;
|
执行结果:2021
执行结果:2012
7)日期转月函数:month
语法:month(string date),返回值:int。说明:返回日期中的月份。举例:
|-------------------------------------------------------------------------------------------|
| hive> select month(``'2011-12-08 10:03:01'``);
hive> select month(``'2011-08-08'``) ;
|
执行结果:12
执行结果:8
8)日期转天函数:day
语法:day(string date),返回值:int。说明:返回日期中的天。举例:
|-----------------------------------------------|
| hive>select day(``'2021-12-08 10:03:01'``);
|
执行结果:8
9)日期转小时函数:hour
语法:hour(string date),返回值:int。说明:返回日期中的小时。举例:
|-------------------------------------------------|
| hive> select hour(``'2021-12-08 10:03:01'``);
|
执行结果:10
10)日期转分钟函数:minute
语法:minute(string date),返回值:int,说明:返回日期中的分钟。举例:
|---------------------------------------------------|
| hive> select minute(``'2021-12-08 10:03:01'``);
|
执行结果:3
11)日期转秒函数:second
语法:second (string date),返回值:int。说明:返回日期中的秒。举例:
|---------------------------------------------------|
| hive> select second(``'2021-12-08 10:03:01'``);
|
执行结果:1
12)日期转周函数:weekofyear
语法:weekofyear(string date),返回值:int。说明:返回日期在当前的周数。举例:
|-------------------------------------------------------|
| hive> select weekofyear(``'2021-12-08 10:03:01'``);
|
执行结果:49
13)日期比较数:datediff
语法:datediff(string enddate,string startdate),返回值:int。说明:返回结束日期减去开始日期的天数。举例:
|-------------------------------------------------------------|
| hive> select datediff(``'2021-12-08'``,``'2021-12-01'``);
|
执行结果:7
14)日期增加函数date_add
语法:date_add(string startdate,int days),返回值:string。说明:返回开始日期startdate增加days天后的日期。举例:
|---------------------------------------------------|
| hive> select date_add(``'2021-12-08'``,``10``);
|
执行结果:2021-12-18
15)日期减少函数:date_sub
语法:date_sub(string startdate,int days),返回值:string。说明:返回开始日期startdate减少days天后的日期。举例:
|---------------------------------------------------|
| hive> select date_sub(``'2021-12-08'``,``10``);
|
执行结果:2012-11-28
16) 当前时间日期函数:current_date
语法: current_date(),返回值: date。说明: 返回当前时间日期
|------------------------------|
| hive> select current_date;
|
2022-01-06
17) 当前时间日期函数:current_timestamp
语法: current_timestamp(),返回值: timestamp。说明: 返回当前时间戳
|-------------------------------------|
| hive> select current_timestamp();
|
2022-01-06 22:52:11.309
18)月份增加函数:add_months
语法: add_months(string start_date, int num_months) ,返回值: string。说明: 返回当前时间下再增加num_months个月的日期
|-------------------------------------------------------------|
| hive> select add_months('``1996``-``10``-``21``',``10``);
|
1997-08-21
19)最后一天的日期函数:last_day
语法: last_day(string date) ,返回值: string。说明: 返回这个月的最后一天的日期,忽略时分秒部分(HH:mm:ss)
|------------------------------------------|
| hive> select last_day(current_date());
|
2024-07-31
3条件函数
1) lf函数:if
语法:if(boolean testCondition,T valueTrue,T valueFalseOrNull),返回值:T。说明:当条件testCondition为TRUE时,返回valueTrue;否则返回valueFalseOrNull举例:
|----------------------------------------------------------------------------------------------------------|
| hive> select ``if``(``1``=``2``,``100``,``200``) ;
hive> select ``if``(``1``=``1``,``100``,``200``);
|
执行结果:200
执行结果:100
2)非空查找函数:COALESCE
语法:COALESCE(T v1,T v2,...),返回值:T。说明:返回参数中的第一个非空值:如果所有值都为NULL,那么返回NULL举例:
|-----------------------------------------------------|
| hive> select COALESCE(``null``,``'100'``,``50``);
|
执行结果:100
3)条件判断函数:CASE
语法:CASE a WHEN b THEN c [WHEN d THEN e]*[ELSE f] END,返回值:T。说明:如果a等于b,那么返回c;如果a等于d,那么返回e;否则返回f举例:
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| hive> Select ``case
100
when ``50
then ``'tom'
when ``100
then ``'mary'
else
'tim'
end;
hive> Select ``case
200
when ``50
then ``'tom'
when ``100
then ``'mary'
else
'tim'
end;
|
执行结果:mary
执行结果:tim
4数学函数
1)取整函数:round
语法:round(double a),返回值:BIGINT。说明:返回double类型的整数值部分(遵循四舍五入)举例:
|---------------------------------------------------------------------|
| hive> select round(``3.1415926``);
hive> select round(``3.5``);
|
执行结果:3
执行结果:4
2)指定精度取整函数:round
语法:round(double a,int d),返回值:DOUBLE。说明:返回指定精度d的double类型举例:
|--------------------------------------------|
| hive> select round(``3.1415926``,``4``);
|
执行结果:3.1416
3)绝对值数:abs
语法:abs(double a) abs(int a),返回值:double int。说明:返回数值a的绝对值举例:
|----------------------------------------------------------------------------------------|
| hive> select abs(-``3.9``);
执行结果:``3.9
hive> select abs(``11.9``);
执行结果:``11.9
|
4)positive函数:positive
语法:positive(int a),positive(double a),返回值:int double。说明:返回a,举例:
|--------------------------------------------------------------------|
| hive> select positive(-``10``);
hive> select positive(``12``);
|
执行结果:-10
执行结果:12
5)negative函数:negative
语法:negative(int a),negative(double a),返回值:int double。说明:返回-a,举例:
|------------------------------------------------------------------|
| hive> select negative(-``5``);
hive> select negative(``8``);
|
执行结果:5
执行结果:-8
5集合函数
1)map类型大小:size
语法:size(Map<K.V>),返回值:int。说明:返回map类型的size举例:
|----------------------------------------------------------------|
| hive> select size(map(``'k1'``,``'v1'``,``'k2'``,``'v2'``));
|
执行结果:2
2)array类型大小:size
语法:size(Array<T>),返回值:int。说明:返回array类型的size举例:
|------------------------------------------------------------|
| hive> select size(array(``1``,``2``,``3``,``4``,``5``));
|
执行结果:5
3) 判断数组否包含元素:array_contains
语法:array_contains(Array<T>,value),返回值: boolean。说明:返回Array<T>中是否包含元素value举例:
|---------------------------------------------------|
| hive> select array_contains(array(1,2,3,4,5),3); |
执行结果:``true
4) 获取map中所有value集合
语法:map_values(Map<K,V>),返回值:array<V>。说明:返回Map<K,V>中所有value的集合举例:
|---------------------------------------------------------------------|
| hive>select map_values(map(``'k1'``,``'v1'``,``'k2'``,``'v2'``));
|
执行结果:["v2","v1"]