一、数学函数
| 函数 |
类型 |
说明 |
示例 |
结果 |
round(double a) |
UDF |
四舍五入取整 |
SELECT round(3.14159); |
3 |
round(double a, int d) |
UDF |
保留d位小数 |
SELECT round(3.14159, 2); |
3.14 |
floor(double a) |
UDF |
向下取整 |
SELECT floor(3.9); |
3 |
ceil(double a) |
UDF |
向上取整 |
SELECT ceil(3.1); |
4 |
rand() |
UDF |
生成[0,1)随机数 |
SELECT rand(); |
0.763(随机) |
rand(int seed) |
UDF |
固定种子的随机数 |
SELECT rand(3); |
固定值 |
abs(double a) |
UDF |
绝对值 |
SELECT abs(-10); |
10 |
power(a, p) |
UDF |
a的p次幂 |
SELECT power(2, 3); |
8 |
sqrt(double a) |
UDF |
平方根 |
SELECT sqrt(9); |
3.0 |
pmod(int a, int b) |
UDF |
a除以b的正余数 |
SELECT pmod(10, 3); |
1 |
二、字符串函数
| 函数 |
类型 |
说明 |
示例 |
结果 |
concat(str1, str2, ...) |
UDF |
拼接字符串 |
SELECT concat('Hi', 'Hive'); |
HiHive |
concat_ws(sep, str1, str2, ...) |
UDF |
用分隔符拼接字符串 |
SELECT concat_ws('-', '2025', '05', '30'); |
2025-05-30 |
lower(str) |
UDF |
转小写 |
SELECT lower('HIVE'); |
hive |
upper(str) |
UDF |
转大写 |
SELECT upper('hive'); |
HIVE |
trim(str) |
UDF |
去除首尾空格 |
SELECT trim(' hive '); |
"hive" |
split(str, delim)[n] |
UDF |
按分隔符拆分并取第n个元素 |
SELECT split('a,b,c', ',')[1]; |
b |
substr(str, start, len) |
UDF |
截取子串 |
SELECT substr('Hello', 2, 3); |
ell |
length(str) |
UDF |
字符串长度 |
SELECT length('Hive'); |
4 |
三、日期时间函数
| 函数 |
类型 |
说明 |
示例 |
结果 |
current_date() |
UDF |
当前日期 |
SELECT current_date(); |
2025-05-30 |
current_timestamp() |
UDF |
当前时间戳 |
SELECT current_timestamp(); |
2025-05-30 14:30:00 |
year(date) |
UDF |
提取年份 |
SELECT year('2025-05-30'); |
2025 |
month(date) |
UDF |
提取月份 |
SELECT month('2025-05-30'); |
5 |
day(date) |
UDF |
提取日 |
SELECT day('2025-05-30'); |
30 |
datediff(end, start) |
UDF |
计算日期差(天数) |
SELECT datediff('2025-06-01', '2025-05-30'); |
2 |
date_add(start, days) |
UDF |
日期加天数 |
SELECT date_add('2025-05-30', 3); |
2025-06-02 |
date_sub(start, days) |
UDF |
日期减天数 |
SELECT date_sub('2025-05-30', 2); |
2025-05-28 |
四、条件函数
| 函数 |
类型 |
说明 |
示例 |
结果 |
if(cond, true_val, false_val) |
UDF |
条件判断 |
SELECT if(1>0, 'Yes', 'No'); |
Yes |
nvl(value, default) |
UDF |
替换NULL值 |
SELECT nvl(NULL, 'Unknown'); |
Unknown |
coalesce(v1, v2, ...) |
UDF |
返回第一个非NULL值 |
SELECT coalesce(NULL, 'Hive', 'Spark'); |
Hive |
case when ... then ... end |
UDF |
多条件分支 |
SELECT CASE WHEN salary>5000 THEN 'High' ELSE 'Low' END; |
依数据而定 |
五、集合函数
| 函数 |
类型 |
说明 |
示例 |
结果 |
size(map/array) |
UDF |
集合元素数量 |
SELECT size(array('a','b')); |
2 |
map_keys(map) |
UDF |
返回Map的所有key |
SELECT map_keys(map('k1',1,'k2',2)); |
["k1","k2"] |
array_contains(arr, val) |
UDF |
判断数组是否包含某值 |
SELECT array_contains(array(1,2,3), 2); |
true |
sort_array(arr) |
UDF |
数组排序 |
SELECT sort_array(array(3,1,2)); |
[1,2,3] |
collect_set(col) |
UDAF |
聚合时去重(返回Array) |
SELECT collect_set(name) FROM student; |
["Amy","Bob"] |
collect_list(col) |
UDAF |
聚合时不去重(返回Array) |
SELECT collect_list(score) FROM exam; |
[90,85,90] |
六、类型转换函数
| 函数 |
类型 |
说明 |
示例 |
结果 |
cast(expr AS type) |
UDF |
强制类型转换 |
SELECT cast('123' AS int); |
123 |
binary(str) |
UDF |
字符串转二进制 |
SELECT binary('Hive'); |
二进制流 |
七、数据脱敏函数
| 函数 |
类型 |
说明 |
示例 |
结果 |
mask_hash(str) |
UDF |
生成字符串的哈希值(SHA-256) |
SELECT mask_hash('secret'); |
十六进制哈希串 |
md5(str) |
UDF |
计算MD5值 |
SELECT md5('data'); |
32位哈希串 |
八、其他实用函数
| 函数 |
类型 |
说明 |
示例 |
结果 |
explode(arr/map) |
UDTF |
将数组/Map展开为多行 |
SELECT explode(array('A','B')); |
A B |
current_user() |
UDF |
当前登录用户 |
SELECT current_user(); |
hadoop_user |
version() |
UDF |
Hive版本 |
SELECT version(); |
3.1.2 |
九、UDTF函数与侧视图(Lateral View)
场景:将数组拆分为多行并保留原表其他字段
示例:拆分电影分类数组
SELECT movie, category_name
FROM movie_info
LATERAL VIEW explode(split(category, '/')) tmp AS category_name;
输入表 movie_info:
| movie |
category |
| Avengers |
Action/Sci-Fi |
| 输出: |
|
| movie |
category_name |
| ------------- |
--------------- |
| Avengers |
Action |
| Avengers |
Sci-Fi |
总结与使用技巧
- 查看所有函数:
SHOW FUNCTIONS; -- 列出全部内置函数
DESCRIBE FUNCTION EXTENDED upper; -- 查看函数详细用法(含示例)
- 函数分类原则:
- UDF:单行输入 → 单行输出(如
upper())
- UDAF:多行输入 → 单行输出(如
sum())
- UDTF:单行输入 → 多行输出(如
explode())
- NULL处理:优先使用
nvl()或coalesce()避免计算中断。
- 永久函数:通过
CREATE FUNCTION ... USING JAR注册自定义函数。
完整函数列表参考Hive官方文档。实际使用中,结合EXPLAIN关键字可分析函数执行逻辑。