您的位置:首页 > 其它

关于HiveQL的常用语法总结(三)——常用函数

2017-05-21 16:43 483 查看
这一节,常常可以使得我们的hive代码简洁高效,甚至是完成一些用常规方法“基本完成不了”的事情,所以这一节我也想跟大家分享下。

本节主要分享下平时经常用到的但又容易忽略的函数,肯定不是Hive的全部内置函数。Hive的全部内置函数可以从

获取。


参考链接:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

5、日期函数

在实际生产中,这一块实在太重要了!为什么呢?因为大多时候业务都是与时间区间或者时间点挂钩的,如果项目涉及的业务较为多或者复杂,那么肯定有多个时间来支撑。一般地,时间都会作为项目参数放出来,以待业务后续方便使用。举个例子:

银行每天需要对客户当天的交易信息进行批处理,加入今天发现了一个问题,可能是前天的数据出问题了,前天的数据需要重新跑批。这个时候如果跑批项目没有将时间参数留出来,那么技术人员就需要修改代码,上线项目,重新跑批,是不是很麻烦!!所以时间参数一定要留出来!

留时间参数出来很重要,那如果说业务中使用了10个时间点的数据,那是不是得把10个时间点都当做参数留出来呢?如果涉及到100个时间点呢?显然是不能把所有时间点都当做参数留出来的嘛!我们还是希望尽量少的参数留出来。

如果用上了Hive的日期函数,那么再加上业务规则,基本上可以使保留出来的日期参数个数为1。是不是很神奇,下面来分享下日期函数。



其中,常用的函数有:

to_date()

year(string date)

month(string date)

day(string date)–获取日期的天数,比如day(‘2017-03-23’)=23

datediff(string enddate, string startdate) –两个时间参数的日期之差。

date_add(string startdate, int days) –给定时间,在此基础上加上指定的时间段。

date_sub(string startdate, int days) –给定时间,在此基础上减去指定的时间段。

add_months(string start_date, int num_months) –加月份

last_day(string date) –Returns the last day of the month

next_day(string start_date, string day_of_week) –Returns the first date which is later than start_date and named as day_of_week

trunc(string date, string format) –Returns date truncated to the unit specified by the format (as of Hive 1.2.0). Supported formats: MONTH/MON/MM, YEAR/YYYY/YY. Example: trunc(‘2015-03-17’, ‘MM’) = 2015-03-01.

months_between(date1, date2) –Returns number of months between dates date1 and date2

2、数值计算方面

hive> select round(3.1415926,4);--可指定精度,不指定为0
3.1416
hive> select ceil(3.1415926);--向上取整,同ceiling,返回 BIGINT
4
hive> select rand();
0.6638336467363424
hive> select rand(100);--返回一个0到1范围内的随机数。如果指定种子seed,则会等到一个稳定的随机数序列
0.7220096548596434
hive> select exp(2);
7.38905609893065
hive> select log10(100);
2.0
hive> select log(4,256)
4.0
hive> select unhex(‘616263’)
abc
hive> select conv(17,10,16);--将17从10进制转化为16进制
11
hive> select pmod(9,4); --返回正的a除以b的余数
1
hive> select positive(-10);--取与原值相同的值
-10
hive> select positive(12);
12
hive> select negative(-5);--取与原值相反的值
5
hive> select negative(8);
-8


3、聚合函数

集合统计函数

2.1 个数统计函数: count

语法: count(*), count(expr), count(DISTINCT expr[, expr_.])

返回值: int

说明: count(*)统计检索出的行的个数,包括NULL值的行;count(expr)返回指定字段的非空值的个数;count(DISTINCTexpr[, expr_.])返回指定字段的不同的非空值的个数

举例:

hive> select count(*) from lxw_dual;
20
hive> select count(distinct t) from lxw_dual;
10


2.2 总和统计函数: sum

语法: sum(col), sum(DISTINCT col)

返回值: double

说明: sum(col)统计结果集中col的相加的结果;sum(DISTINCT col)统计结果中col不同值相加的结果

举例:

hive> select sum(t) from lxw_dual;
100
hive> select sum(distinct t) from lxw_dual;
70


2.3 平均值统计函数: avg

语法: avg(col), avg(DISTINCT col)

返回值: double

说明: avg(col)统计结果集中col的平均值;avg(DISTINCT col)统计结果中col不同值相加的平均值

举例:

hive> select avg(t) from lxw_dual;
50
hive> select avg (distinct t) from lxw_dual;
30


2.4 最小值统计函数: min

语法: min(col)

返回值: double

说明: 统计结果集中col字段的最小值

举例:

hive> select min(t) from lxw_dual;
20


2.5 最大值统计函数: max

语法: maxcol)

返回值: double

说明: 统计结果集中col字段的最大值

举例:

hive> select max(t) from lxw_dual;
120


2.6 直方图:histogram_numeric

语法: histogram_numeric(col, b)

返回值: array

hive> select histogram_numeric(100,5) from lxw_dual;
[{"x":100.0,"y":1.0}]


此部分还有row_number,dense_rank等分组聚合函数,可参考这里

ntile函数,可参考这里

4、与空有关的函数

3.1 非空查找函数: COALESCE

语法: COALESCE(T v1, T v2, …)

返回值: T

说明: 返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULL

举例:

hive> select COALESCE(null,'100','50′) from lxw_dual;
100


3.2删除空格

string:trim(string A) –删除字符串两端的空格,字符之间的空格保留

string:rtrim(string A) –删除字符串右边的空格,字符之间的空格保留

string:ltrim(string A) –删除字符串左边的空格,字符之间的空格保留

string:space(int n) –返回指定数量的空格

string:repeat(string str, int n) –重复N次字符串

string:lpad(string str, int len, string pad) –返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从左侧填补。

string:rpad(string str, int len, string pad) –返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从右侧填补。

5、字符串函数

int:length(string A) –返回字符串的长度

string:reverse(string A) 返回倒序字符串

string:concat(string A, string B…) 连接多个字符串,合并为一个字符串,可以接受任意数量的输入字符串

string:concat_ws(string SEP, string A, string B…) 链接多个字符串,字符串之间以指定的分隔符分开。

string:substr(string A, int start) substring(string A, int start) 从文本字符串中指定的起始位置后的字符。

string:substr(string A, int start, int len) substring(string A, int start, int len) 从文本字符串中指定的位置指定长度的字符。

string:upper(string A) ucase(string A) 将文本字符串转换成字母全部大写形式

string:lower(string A) lcase(string A) 将文本字符串转换成字母全部小写形式

string:trim(string A) 删除字符串两端的空格,字符之间的空格保留

string:ltrim(string A) 删除字符串左边的空格,其他的空格保留

string:rtrim(string A) 删除字符串右边的空格,其他的空格保留

string:regexp_replace(string A, string B, string C) 字符串A中的B字符被C字符替代

string:regexp_extract(string subject, string pattern, int index) 通过下标返回正则表达式指定的部分。regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 2) returns ‘bar.’

string:parse_url(string urlString, string partToExtract [, string keyToExtract]) 返回URL指定的部分。

parse_url(‘http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1′, ‘HOST’) 返回:’facebook.com’


string:get_json_object(string json_string, string path) select a.timestamp, get_json_object(a.appevents, ‘.eventid′),getjsonobject(a.appenvets,‘.eventname’) from log a;

string:space(int n) 返回指定数量的空格

string:repeat(string str, int n) 重复N次字符串

int:ascii(string str) 返回字符串中首字符的数字值

string:lpad(string str, int len, string pad) 返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从左侧填补。

string:rpad(string str, int len, string pad) 返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从右侧填补。

array:split(string str, string pat) 将字符串转换为数组。

int:find_in_set(string str, string strList) 返回字符串str第一次在strlist出现的位置。如果任一参数为NULL,返回NULL;如果第一个参数包含逗号,返回0。

array

hive>sentences(‘Hello there! How are you?’)
((“Hello”, “there”), (“How”, “are”, “you”))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: