本篇介绍一下一些常用的HIVE(0.80版本)内置函数:
1、数学函数
返回值类型 | 样式 | 描述 |
---|---|---|
BIGINT | floor(DOUBLE d) | 返回小于等于d的最大整数 |
BIGINT | ceil(DOUBLE d) | 返回大于等于d的最小整数 |
DOUBLE | rand(),rand(INT seed) | 返回一个DOUBLE型的随机数,seed是随机因子 |
DOUBLE | pow(DOUBLE d,DOUBLE p) | 计算d的p次幂 |
DOUBLE | sqrt(DOUBLE d) | 计算d的平方根 |
DOUBLE | abs(DOUBLE d) | 计算d的绝对值 |
2、聚合函数
聚合函数是一类比较特殊的函数,可以对多行进行一些计算,然后得到一个结果值,这类函数中最有名的两个例子就是count和avg,分别计算行数和平均值。
hive中常用的聚合函数有:
返回值类型 | 样式 | 描述 |
---|---|---|
BIGINT | count(*) | 计算总行数,包括含有NULL值的行 |
BIGINT | count(expr) | 计算提供的expr表达式的值非NULL的行数 |
BIGINT | count(DISTINCT expr) | 计算提供的expr表达式的值排重后非NULL的行数 |
DOUBLE | sum(col) | 计算制定行的值的和 |
DOUBLE | sum(DISTINCT col) | 计算排重后值的和 |
DOUBLE | avg(col) | 计算指定行的值的平均值 |
DOUBLE | avg(DISTINCT col) | 计算排重后值的平均值 |
DOUBLE | min(col) | 计算指定行的最小值 |
DOUBLE | max(col | 计算指定行的最大值 |
3、表生成函数
与聚合函数相反的一类函数就是所谓的表生成函数,其可以将单列扩展为多列或者多行。比如下面的例子可以将一个字符串数组的内容转换成0个或者多个新的记录行。如果subordinates字段内容为空的话,将不会产生新的记录,如果不为空的话,这个数组中的每个元素都将产生一行新纪录。
SELECT explode(subordinates) AS sub FROM employees;
Hive中常用的表生成函数有:
返回值类型 | 样式 | 描述 |
---|---|---|
n行结果 | explode(ARRAY array) | 返回0到多行结果,每行对应输入的array数组中的一个元素 |
n行结果 | explode(MAP map) | 返回0到多行结果,每行对应每个map键值对,其中一个字段是map的键,另一个字段对应map的值 |
数组的类型 | explode(ARRAY<TYPE> a) | 对于a中的每个元素,explode()会产生一行记录包含这个元素 |
结果插入表中 | Inline(ARRAY<STRUCT[,STRUCT]>) | 将结构体数组提取出来并插入到表中 |
TUPLE | json_tuple(STRING jsonStr,p1,p2,…pn) | 本函数可以接受多个标签名称,对输入的JSON字符串进行处理,和get_json_object这个UDF类似,不过更高效,其通过一次调用就可以获得多个键值 |
TUPLE | parse_url_tuple(url,partname1,partname2,…..mpartnameN),N>=1 | 从URL中解析出N个部分信息,其输入参数是URL,以及多个要抽取的部分的名称 |
N行结果 | stack(INT n,col1,….,colM) | 把M列转换成N行,每行有M/N个字段,其中n必须是个常数 |
4、其他内置函数
Hive还提供了许多其他功能强大的内置函数:
返回值类型 | 样式 | 描述 |
---|---|---|
STRING | concat(STRING s1,STRING s2,…..) | 将字符串s1,s2等拼接成一个字符串 |
STRING | concat_ws(STRING separator,STRING s1,STRING s2,…) | 将字符串s1,s2等根据指定的分隔符separator拼接起来 |
INT | find_in_set(STRING s,STRING commaSeparatedString) | 返回以逗号分隔的字符串中s出现的位置,如果没有找到返回NULL |
STRING | get_json_object(STRING json_string,STRiNG path) | 从给定路径上的JSON字符串中抽取出JSON对象,并返回这个对象的JSON字符串形式,如果输入的JSON字符串是非法的,返回NULL |
INT | length(STRING s) | 计算字符串的长度 |
STRING | lower(STRING s) | 将字符串转换为小写形式 |
STRING | regexp_extract(STRING subject,STRING regex_pattern,STRING index) | 抽取字符串subject中符合正则表达式regex_pattern的第index个部分的子字符串,index为0表示整个字符串,从1开始表示各个字串 |
STRING | regexp_replace(STRING s,STRING regex,STRING replacement) | 按照Java正则表达式regex将字符串s中符合条件的部分替换为replacement所指定的字符串a |
STRING | reverse(STRING s) | 反转字符串 |
STRING | size(MAP/ARRAY) | 返回map或者ARRAY中元素的个数 |
ARRAY<STRING> | split(STRING s,STRING pattern) | 按照正则表达式pattern分割字符串s,并将分割后的部分以字符串数组方式返回 |
STRING | upper(STRING A) | 将字符串中所欲字母转换为大写字母 |
STRING | from_unixtime(BIGINT unixtime[,STRING format]) | 将时间戳描述转换成UTC时间,并用字符串表示,可以通过format规定的时间格式,指定输出的时间格式 |
BIGINT | unix_timetime(STRING date) | 输入的时间字符串格式必须是yyyy-MM-dd HH:MM:SS,如果不符合则返回0,如果符合则将此时间字符串转换为Unix时间戳。 |
BIGINT | unix_timetime(STRING date,STRING pattern) | 将指定时间字符串格式字符串转换为unix时间戳,如果格式不对则返回0 |
INT | datediff(STRING startdate,STRING enddate) | 计算开始时间startdate到结束时间enddate相差的天数 |