内置函数

查看系统自带函数

hive> show functions;
-- 显示自带函数的描述:
hive> desc function size;
-- 函数详细信息,如何使用:
hive> desc function extended nvl;

数学函数

函数

说明

round(double a, int d)

小数部分d位之后数字四舍五入,例如round(21.263,2),返回21.26

floor(double a)

对给定数据进行向下舍入最接近的整数。例如floor(21.2),返回21。

ceil(double a),

ceiling(double a)

将参数向上舍入为最接近的整数。例如ceil(21.2),返回22.

rand(), rand(int seed)

返回大于或等于0且小于1的平均分布随机数(依重新计算而变)

exp(double a)

返回e的n次方

pow(double a, double p)

   返回某数的乘幂

sqrt(double a)

返回数值的平方根

bin(BIGINT a)

返回二进制格式

hex(BIGINT a)

hex(string a)

将整数或字符转换为十六进制格式

conv(BIGINT

num, int

from_base, int to_base)

将指定数值由原来的度量体系转化为指定的度量体系。例如CONV(‘a’,16,2),返回 ‘1010’

收集函数

函数

说明

size(Map<K.V>)

返回的map类型的元素的数量

size(Array)

返回数组类型的元素数量

类型转换函数

Int->bigint自动转换, bigint->int需要强制类型

函数

说明

cast(expr as type)

类型转换。例如将字符”1″转换为整数:cast(’1′ as bigint),如果转换失败返回NULL。

日期函数

函数名语法功能说明示例
获取当前时间current_date()返回当前日期(YYYY-MM-DD)current_date() → 2026-01-21
current_timestamp()返回当前日期时间(YYYY-MM-DD HH:MM:SS.fff)current_timestamp() → 2026-01-21 15:30:45.123
unix_timestamp()返回当前时间戳(从1970-01-01到现在的秒数)unix_timestamp() → 1737459045
日期与时间戳转换
 
unix_timestamp(date_str [, format])将字符串按指定格式转为时间戳unix_timestamp('20260121', 'yyyyMMdd') → 1737427200
from_unixtime(timestamp [, format])将时间戳转为指定格式的日期字符串from_unixtime(1737427200, 'yyyy-MM-dd') → 2026-01-21
日期加减date_add(start_date, days)日期加 N 天date_add('2026-01-21', 7) → 2026-01-28
date_sub(start_date, days)日期减 N 天date_sub('2026-01-21', 7) → 2026-01-14
日期差计算datediff(end_date, start_date)计算两个日期的天数差(end - start)datediff('2026-01-28', '2026-01-21') → 7
日期截断trunc(date, unit)按指定单位截断日期(YYYY/MM/DD等),把日期精准定位到指定单位的第一个时间点trunc('2026-01-21', 'MM') → 2026-01-01,保留年、月,日置为 1
日期提取
 
year(date)提取年份year('2026-01-21') → 2026
month(date)提取月份month('2026-01-21') → 1
day(date) / dayofmonth(date)提取日期day('2026-01-21') → 21
hour(timestamp)提取小时hour('2026-01-21 15:30:45') → 15
minute(timestamp)提取分钟minute('2026-01-21 15:30:45') → 30
second(timestamp)提取秒second('2026-01-21 15:30:45') → 45
weekofyear(date)提取日期所在的周数(1-53)weekofyear('2026-01-21') → 4
日期格式化date_format(date, format)将日期按指定格式转为字符串date_format('2026-01-21', 'yyyyMMdd') → 20260121
字符串转日期to_date(date_str)将字符串转为日期类型(默认 YYYY-MM-DD)to_date('2026-01-21 15:30:45') → 2026-01-21

条件函数

函数名语法格式核心功能实操示例
IF 函数if(condition, true_val, false_val)三元判断:条件为真返回true_val,否则返回false_val;任意参数为NULL则返回NULLif(10>5, '大于', '小于')
CASE WHEN(简单版)case expr when val1 then res1 [when val2 then res2] [else default] end匹配表达式值:按顺序匹配expr的值,命中则返回对应结果,无匹配返回default(默认NULL)case gender when '1' then '男' when '2' then '女' else '未知' end
CASE WHEN(通用版)case when cond1 then res1 [when cond2 then res2] [else default] end通用多条件:按顺序判断条件,第一个满足的条件返回对应结果,无满足则返回defaultcase when score>=90 then '优秀' when score>=60 then '及格' else '不及格' end
NVL 函数nvl(expr1, expr2)空值替换:expr1为NULL则返回expr2,否则返回expr1nvl(salary, 0),薪资为NULL返回0,否则返回原薪资
NVL2 函数nvl2(expr1, expr2, expr3)空值分支:expr1非NULL返回expr2,expr1为NULL返回expr3nvl2(email, '有邮箱', '无邮箱'),邮箱非空返回'有邮箱',否则返回'无邮箱'
COALESCE 函数coalesce(expr1, expr2, ..., exprN)多值兜底:返回第一个非NULL的参数,全NULL则返回NULLcoalesce(phone, email, id_card),优先返回手机号,无则返回邮箱,无则返回身份证号
ISNULL 函数isnull(expr)判断空值:expr为NULL返回true,否则返回falseisnull(salary)
ISNOTNULL 函数isnotnull(expr)判断非NULL:expr非NULL返回true,否则返回falseisnotnull(name)

字符串函数

函数名语法格式核心功能示例&结果
lengthlength(str)计算字符串长度(含空格,NULL返回NULL)length('Hive 字符串') -> 8
concatconcat(str1, str2, ...)拼接多个字符串(任意参数为NULL则返回NULL)concat('Hive-', '2.3', '-SQL') -> Hive-2.3-SQL
concat_wsconcat_ws(sep, str1, str2, ...)按分隔符拼接字符串(忽略NULL值)concat_ws(',', '张三', NULL, '18') -> 张三,18
substr/substringsubstr(str, pos[, len])截取字符串:pos为起始位置(从1开始),len为截取长度(可选)substr('HiveSQL', 1, 4) -> Hive,substr('HiveSQL', 5) -> SQL
upperupper(str)将字符串转为大写upper('hive') -> HIVE
lowerlower(str)将字符串转为小写lower('HIVE') -> hive
trimtrim(str)去除字符串首尾空格trim('  Hive  ')
ltrimltrim(str)去除字符串左侧空格ltrim('  Hive  ')  
rtrimrtrim(str)去除字符串右侧空格rtrim('  Hive  ')
replacereplace(str, old, new)替换字符串中指定子串replace('HiveSQL', 'SQL', '函数') -> Hive函数
regexp_replaceregexp_replace(str, regex, rep)按正则表达式替换子串regexp_replace('Hive123', '[0-9]', '') -> Hive
splitsplit(str, sep)按分隔符拆分字符串为数组split('a,b,c', ',') -> ["a","b","c"]
instrinstr(str, substr)查找子串首次出现的位置(无则返回0,从1开始)instr('HiveSQL', 'SQL') -> 5
locatelocate(substr, str[, pos])从pos位置开始查找子串(无则返回0)locate('e', 'HiveSQL', 3) -> 4
lpadlpad(str, len, pad)左侧补字符至指定长度lpad('Hive', 6, '*') -> **Hive
rpadrpad(str, len, pad)右侧补字符至指定长度rpad('Hive', 6, '*') -> Hive**
nvlnvl(str, default)字符串空值替换nvl(NULL, '空值') -> 空值
regexp_extractregexp_extract(str, regex, idx)按正则提取子串(idx为分组索引,1开始)regexp_extract('Hive123SQL', '(\\d+)', 1) -> 123

内置的聚合函数(UDAF)

多进一出:进来多个值,聚合后变成一个值。

函数名语法格式核心功能示例&结果
countcount([DISTINCT] expr)统计行数/非NULL值数量;加DISTINCT去重统计count(*) -> 统计总行数;count(DISTINCT user_id) -> 统计去重用户数
sumsum([DISTINCT] expr)计算数值列的总和;加DISTINCT去重求和sum(salary) -> 所有薪资总和;sum(DISTINCT score) -> 去重分数总和
avgavg([DISTINCT] expr)计算数值列的平均值;加DISTINCT去重求平均avg(age) -> 年龄平均值;avg(DISTINCT amount) -> 去重金额平均值
maxmax(expr)获取列的最大值(支持数值/字符串/日期类型)max(score) -> 最高分数;max(create_time) -> 最新创建时间
minmin(expr)获取列的最小值(支持数值/字符串/日期类型)min(price) -> 最低价格;min(name) -> 按字符串排序的最小姓名
sum_distinctsum(DISTINCT expr)专用去重求和(等价于sum(DISTINCT expr))sum_distinct(sales) -> 去重销售额总和
avg_distinctavg(DISTINCT expr)专用去重求平均(等价于avg(DISTINCT expr))avg_distinct(score) -> 去重分数平均值
collect_listcollect_list(expr)将分组后的列值聚合为数组(不去重,保留顺序)collect_list(imei) -> ["123","456","123"]
collect_setcollect_set(expr)将分组后的列值聚合为数组(去重)collect_set(imei) -> ["123","456"]
variancevariance(expr)计算数值列的方差variance(score) -> 分数方差值
stddevstddev(expr)计算数值列的标准差(等价于stddev_samp)stddev(salary) -> 薪资标准差
stddev_popstddev_pop(expr)计算数值列的总体标准差stddev_pop(age) -> 年龄总体标准差
stddev_sampstddev_samp(expr)计算数值列的样本标准差stddev_samp(amount) -> 金额样本标准差
var_popvar_pop(expr)计算数值列的总体方差var_pop(score) -> 分数总体方差
var_sampvar_samp(expr)计算数值列的样本方差var_samp(price) -> 价格样本方差
percentilepercentile(expr, p)计算数值列的p分位数(p取值0~1)percentile(salary, 0.5) -> 薪资中位数(50分位数)
percentile_approxpercentile_approx(expr, p[, B])近似计算分位数(适合大数据集,B为精度参数)percentile_approx(score, 0.9, 10000) -> 90分位数近似值
corrcorr(expr1, expr2)计算两列的皮尔逊相关系数corr(sales, cost) -> 销售额与成本的相关系数
covar_popcovar_pop(expr1, expr2)计算两列的总体协方差covar_pop(age, salary) -> 年龄与薪资的总体协方差
covar_sampcovar_samp(expr1, expr2)计算两列的样本协方差covar_samp(score, study_time) -> 分数与学习时长的样本协方差

内置表生成函数(UDTF)

函数名语法格式核心功能示例&结果
explodeexplode(array/map)将数组/Map类型字段拆分为多行(UDTF);数组拆分为单值行,Map拆分为key-value行explode(array('a','b','c')) -> 生成3行:a、b、c;explode(map('name','张三','age','18')) -> 生成2行:name-张三、age-18
posexplodeposexplode(array)拆分数组并返回元素位置(索引从0开始)+元素值,生成两列(pos, val)posexplode(array('a','b','c')) -> 生成3行:(0,a)、(1,b)、(2,c)
inlineinline(array<struct>)将结构体数组拆分为多行多列,结构体的每个字段对应一列inline(array(named_struct('id',1,'name','张三'), named_struct('id',2,'name','李四'))) -> 生成2行,每行含id/name两列:1-张三、2-李四
stackstack(n, col1, col2, ..., coln)将单行多列数据拆分为多行,n指定拆分后行数,需保证列数是n的整数倍stack(2, '张三',18,'李四',20) -> 拆分为2行,每行2列:(张三,18)、(李四,20)
json_tuplejson_tuple(json_str, k1, k2, ..., kn)一次性解析JSON字符串的多个字段,返回多列(替代get_json_object,效率更高)json_tuple('{"name":"张三","age":18,"city":"北京"}', 'name','age') -> 返回两列:张三、18
parse_url_tupleparse_url_tuple(url, p1, p2, ..., pn)一次性解析URL的多个部分(PROTOCOL/HOST/PATH等),返回多列parse_url_tuple('https://www.baidu.com/s?wd=hive', 'PROTOCOL','HOST','PATH') -> 返回三列:https、www.baidu.com、/s

 实战:hive实现wordcount

1. 数据准备

[root@node4 data]# vim wc.txt
hello tom
andy joy
hello rose
hello joy
mark andy
hello tom
andy rose
hello joy

2. 创建原始数据表

create table words(line string);

3. 将数据文件wc.txt load到words表中:

hive> load data local inpath '/root/data/wc.txt' into table words;

4. 编写sql语句,先将每行内容按照空格拆分

hive> select split(line,' ') from words;
OK
["hello","tom"]
["andy","joy"]
["hello","rose"]
["hello","joy"]
["mark","andy"]
["hello","tom"]
["andy","rose"]
["hello","joy"]
Time taken: 0.352 seconds, Fetched: 8 row(s)

5. 将数组的元素再次进行拆解

hive> select explode(split(line,' ')) from words;
OK
hello
tom
andy
joy
hello
rose
hello
joy
......

6. 按照单词进行分组,并统计数量

select word,count(word)
from (select explode(split(line,' ')) word from words) tmp
group by word;

7. 创建结果表,并将结果添加到结果表中

hive>create table wc_count(word string,count int);
hive>from (select explode(split(line,' ')) word from words) tmp
     insert into wc_count
     select word,count(word)
     group by word;

UDF开发

UDF(User-Defined Function)就是用户自定义函数,是 Hive 为了满足内置函数无法覆盖的业务需求,允许开发者自定义的、可像内置函数一样调用的函数。

实战:对手机号进行数据脱敏

对手机号码列进行数据脱敏  13812345678->138****5678

1、 UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。

2、编写UDF函数的时候需要注意一下几点:

a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。

b)需要实现evaluate函数, evaluate函数支持重载。

具体实现:

1. 创建一个maven项目hivedemo

2. 添加hive的依赖

<dependencies>
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>3.1.2</version>
    </dependency>
</dependencies>

3. 创建类PhoneDataMasking

package com.wusen.hadoop;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class PhoneDataMasking extends UDF {
    //final用于禁止方法内修改入参
    public Text evaluate(final Text tt){
        if (tt == null  || tt.toString().length() != 11){
            return  tt;
        }
        //获取手机号码
        String phone = tt.toString();
        //脱敏处理
        String result = phone.substring(0,3) + "****" + phone.substring(7);
        return new Text(result);
    }
}

4. 将项目打成jar包,将jar包改名为hive1.jar

5. 将hive1.jar上传到node4的/root/data目录下

6. 进入hive客户端,添加jar

hive> add jar /root/data/hive1.jar;
hive> list jar;
/root/data/hive1.jar

7. 创建函数

hive> create temporary function tuomin as 'com.wusen.hadoop.PhoneDataMasking';

8.测试

-- 创建虚拟表,并插入数据,如果数据表为空的话,后续Hive 只会输出 OK 和耗时,不会显示任何结果行。
hive> create table dual(id string);
hive> insert into dual values(" "); 
-- 测试函数
hive>  select tuomin('13812345678') from dual;
OK
138****5678

9.删除临时函数

hive> drop temporary function tuomin;

10. 将hive1.jar上传到hdfs文件系统中的/usr

[root@node4 data]# hdfs dfs -put /root/data/hive1.jar /usr

11. 使用hdfs文件系统/usr/hive1.jar创建临时函数

hive> create temporary function tuomin as 'com.wusen.hadoop.PhoneDataMasking' using jar 'hdfs://mycluster/usr/hive1.jar';

12.测试

hive> select tuomin('13912345678') from dual; 
OK
139****5678

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐