hive中的函数

以下是 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 的'正则神器'。"

相关推荐
clownAdam5 小时前
Hive数仓分层架构必要性分析
hive·hadoop·架构
大叔_爱编程1 天前
基于大数据的短视频用户兴趣分析-hive+django+spider
大数据·hive·django·毕业设计·源码·课程设计·spider
张人玉1 天前
大数据hadoop系列——在ubuntu上安装HBase 伪分布式
大数据·hadoop·分布式·hbase
笨蛋少年派1 天前
数据仓库建设知识扫盲
数据仓库
张人玉1 天前
大数据Hadoop系列——在ubuntu上安装pig数据库
大数据·hadoop·ubuntu·pig
李慕婉学姐1 天前
【开题答辩过程】以《基于Hadoop的医生相关数据分析与可视化及医生推荐系统》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
大数据·hadoop·数据分析
张人玉1 天前
大数据hadoop系列——在ubuntu上安装hadoop完分布式
大数据·hadoop·分布式
张人玉1 天前
大数据Hadoop系列——在ubuntu上安装Hive 嵌入式
大数据·hadoop·ubuntu
云闲不收1 天前
hive和hadoop如何部署
数据仓库·hive·hadoop