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

相关推荐
飞Link10 小时前
【Hadoop】Linux(CentOS7)下安装Hadoop集群
大数据·linux·hadoop·分布式
飞Link10 小时前
【Sqoop】Linux(CentOS7)下安装Sqoop教程
linux·hive·hadoop·sqoop
飞Link11 小时前
【Hive】Linux(CentOS7)下安装Hive教程
大数据·linux·数据仓库·hive·hadoop
心止水j13 小时前
hbase 电商1
hive
菜鸟冲锋号14 小时前
适配AI大模型非结构化数据需求:数据仓库的核心改造方向
大数据·数据仓库·人工智能·大模型
小鸡脚来咯14 小时前
Hive分桶表:大数据开发的性能优化利器
大数据·hive·性能优化
木卫二号Coding15 小时前
hivesql 字段aa值 如何去掉前面的0
hive
老徐电商数据笔记1 天前
数据仓库工程师在AI时代的走向探究
数据仓库·人工智能
老徐电商数据笔记1 天前
电商数仓存储格式(Textfile/Orc/Parquet)深度解析:五大实战方案与选型指南
大数据·数据仓库·技术面试·数据存储格式
yumgpkpm2 天前
Cloudera CDP 7.3(国产CMP 鲲鹏版)平台与银行五大平台的技术对接方案
大数据·人工智能·hive·zookeeper·flink·kafka·cloudera