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

相关推荐
卷毛迷你猪3 天前
快速实验篇(A11)数据集成与多维分析:从单实验产出到跨实验宽表
hive·hadoop
西木莉3 天前
数据仓库概述
数据仓库
卷毛迷你猪3 天前
快速实验篇(A10)短序列上 SPI 的失效机制
hadoop
Francek Chen4 天前
【大数据处理与分析】数据仓库Hive:04 数据仓库Hive概述
大数据·数据仓库·hive·hadoop·分布式
Gl�ria4 天前
Hadoop/YARN 集群缩容:下线DN节点
大数据·hadoop·分布式
计算机源码社4 天前
基于大数据技术的台北市住宅价格影响因素挖掘与可视化分析-基于Python与Hadoop的台北市住宅价格数据仓库构建与可视化
大数据·hadoop·python·数据分析·spark·毕业设计·数据可视化
计算机源码社4 天前
基于Hadoop+Spark的乳腺癌病理数据可视化分析系统 基于K-Means聚类与PCA降维的乳腺癌形态特征分析系统
大数据·hadoop·python·数据分析·spark·毕业设计·数据可视化
Moshow郑锴4 天前
从“水库”到“直饮水站”:重新理解 Data Mart 与 Data Lake、Data Lakehouse、Data Warehouse 的区别
数据仓库·data·湖仓一体
躺柒5 天前
读数据架构知识体系指南01关系数据仓库(上)
数据仓库·架构·数据分析·spark·数据湖·关系数据库·企业数据仓库
卷毛迷你猪5 天前
快速实验篇(A9-2)Python vs MapReduce:小批量任务的工具选择
大数据·hadoop