以下是 Hive 中老师较少讲解但实用、适合课堂分享的函数清单(按场景分类,附作用、语法、例子及课堂话术),覆盖文本、日期、聚合、JSON 等高频场景:
一、文本处理类
1. parse_url(URL 解析函数)
-
作用:一键拆解 URL 的协议、域名、参数等,替代复杂字符串截取
-
语法 :
parse_url(url_str, part[, key])part可选:PROTOCOL(协议)、HOST(域名)、PATH(路径)、QUERY(参数)
-
例子 :
sql
-- 提取URL中的搜索关键词"大数据" select parse_url('https://www.baidu.com/s?wd=大数据', 'QUERY', 'wd'); -
"分析用户访问日志时,用 substr/split 解析 URL 要写好几行,这个函数是 Hive 的'URL 拆解工具',1 行就能抠出需要的信息,效率超高。"
2. regexp_extract(正则提取函数)
-
作用:按正则规则从字符串中提取指定内容,解决非结构化文本解析
-
语法 :
regexp_extract(str, regex_pattern, group_index) -
例子 :
sql
-- 从手机号"13812345678"中提取后4位 select regexp_extract('13812345678', '138\\d{4}(\\d{4})', 1); -
"处理日志、手机号这类非结构化文本时,正则比手动截字符串更精准,这个函数是 Hive 的'正则提取神器'。"
3. initcap(首字母大写函数)
-
作用:将字符串每个单词的首字母转为大写(其余小写)
-
语法 :
initcap(str) -
例子 :
sql
select initcap('hello big data'); -- 结果:Hello Big Data -
"做报表时要规范文本格式,这个函数能一键把英文短语转成'首字母大写'的格式,不用手动拼接字符串。"
二、JSON / 复杂类型类
4. get_json_object(JSON 精准取值函数)
-
作用:从 JSON 字符串中提取指定层级的字段,无需依赖 JsonSerDe
-
语法 :
get_json_object(json_str, '$.key层级') -
例子 :
sql
-- 从JSON中提取"info"下的"age"字段 select get_json_object('{"name":"小明","info":{"age":18}}', '$.info.age'); -
"临时分析 JSON 数据时,不用建表指定 SerDe,这个函数能直接'抠'出需要的字段,灵活又高效。"
5. map_keys/map_values(Map 键 / 值提取函数)
-
作用:从 Map 类型中提取所有键或值,转为数组
-
语法 :
map_keys(map_col)/map_values(map_col) -
例子 :
sql
-- 提取Map的所有键 select map_keys(map('name','小明','age','18')); -- 结果:["name","age"] -
"处理 Map 类型数据时,这个函数能快速把键或值转成数组,方便后续统计(比如统计有多少个不同的键)。"
三、日期 / 时间类
6. date_format(日期格式化万能函数)
-
作用 :自定义日期格式,替代
from_unixtime的固定格式 -
语法 :
date_format(date_str, '格式模板') -
例子 :
sql
-- 把时间戳转成"2025-12-08 10:30"格式 select date_format(from_unixtime(1733649000), 'yyyy-MM-dd HH:mm'); -
"之前学的
from_unixtime格式固定,这个函数能自定义日期显示方式,做报表时想怎么格式化就怎么来。"
7. datediff/months_between(日期差函数)
-
作用:计算两个日期的 "天数差" 或 "月份差"
-
语法 :
datediff(end_date, start_date)/months_between(end_date, start_date) -
例子 :
sql
-- 计算两个日期相差的天数 select datediff('2025-12-08', '2025-12-01'); -- 结果:7 -
"统计用户'注册后多久下单'这类场景,用这个函数能直接算出天数差,不用手动算日期。"
四、聚合 / 条件类
8. nvl2(增强版空值替换函数)
-
作用 :根据字段是否为空,返回不同结果(比
nvl更灵活) -
语法 :
nvl2(col, 非空返回值, 空返回值) -
例子 :
sql
-- 有分数显示"及格/不及格",无分数显示"缺考" select nvl2(score, if(score>=60,'及格','不及格'), '缺考') from student; -
"
nvl只能替换空值,这个函数能同时处理'空'和'非空'两种情况,一次判断搞定两类逻辑。"
9. collect_set/collect_list(聚合为数组函数)
-
作用 :将分组后的某列聚合为数组(
collect_set去重,collect_list保留重复) -
语法 :
collect_set(col)/collect_list(col) -
例子 :
sql
-- 按班级聚合,收集每个班级的学生姓名 select class, collect_list(name) from student group by class; -
"统计每个班级的学生名单时,这个函数能把姓名'打包'成数组,不用一行一行看数据。"
五、数学计算类
10. percentile(分位数计算函数)
-
作用:计算数值列的分位数(比如中位数、四分位数)
-
语法 :
percentile(col, 分位值) -
例子 :
sql
-- 计算学生分数的中位数 select percentile(score, 0.5) from student; -
"统计数据分布时,中位数比平均数更能反映'中间水平',这个函数能直接算出分位数,不用手动排序。"
十一、 regexp_extract(正则提取函数)
-
作用:按正则表达式从字符串中提取内容,解决复杂文本解析
-
语法 :
regexp_extract(str, regex, group) -
例子 :
sql
-- 从手机号"13812345678"中提取后4位 select regexp_extract('13812345678', '138(\\d{4})(\\d{4})', 2); -
"处理非结构化文本(比如日志、手机号)时,正则提取比手动截字符串更精准,这个函数是 Hive 的'正则神器'。"