hql内置函数详解与使用

一、数学函数

函数 类型 说明 示例 结果
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

总结与使用技巧

  1. 查看所有函数
    SHOW FUNCTIONS;  -- 列出全部内置函数
    DESCRIBE FUNCTION EXTENDED upper;  -- 查看函数详细用法(含示例)
    
  2. 函数分类原则
    • UDF:单行输入 → 单行输出(如upper()
    • UDAF:多行输入 → 单行输出(如sum()
    • UDTF:单行输入 → 多行输出(如explode()
  3. NULL处理:优先使用nvl()coalesce()避免计算中断。
  4. 永久函数:通过CREATE FUNCTION ... USING JAR注册自定义函数。

完整函数列表参考Hive官方文档。实际使用中,结合EXPLAIN关键字可分析函数执行逻辑。

posted @ 2025-05-30 11:53  zz_bigdata  阅读(63)  评论(0)    收藏  举报