Hive函数用法详解


1. Hive 内置函数概述

Hive 内置函数大致可以分为以下几类:

  • 字符串函数
    用于字符串的拼接、截取、大小写转换、替换、正则匹配、JSON 解析、URL 解析等操作。
  • 数学函数
    包括基本的加减乘除、取整、随机数、对数、幂运算、平方根、进制转换以及求最大值、最小值等。
  • 日期函数
    实现日期和时间的格式转换、计算(加减天数、月份、比较、间隔计算)和提取(年、月、日、周等)。
  • 条件函数
    用于实现 if(三元表达式)、nvl、coalesce、CASE 判断等逻辑判断操作。
  • 聚合函数
    如 COUNT、SUM、AVG、MIN、MAX、以及统计分布、直方图、近似中位数等,用于汇总统计。
  • 集合函数和复合类型函数
    针对数组、Map、Struct 等复杂数据类型操作,例如 size、explode、map_keys、collect_list/collect_set 等。
  • 表生成函数(UDTF)
    可以将一行数据拆分成多行输出,常与 lateral view 联用,如 explode、json_tuple、stack 等。
  • 窗口函数
    为分组内的行添加排序、累计、排名等额外信息(如 row_number、rank、lag、lead 等)。

此外,Hive 还支持用户自定义函数(UDF、UDAF、UDTF),让你可以扩展 Hive 的功能以满足特定业务需求。


2. 如何查看和使用 Hive 函数

2.1 查看函数列表

在 Hive 命令行中,可以通过以下命令查看所有支持的内置函数:

SHOW FUNCTIONS;

这条命令会列出所有函数名(从关系运算符到复杂聚合函数)。

2.2 查看函数详细说明

若想了解某个函数的用法、返回值及示例,可以使用:

DESCRIBE FUNCTION <函数名>;
DESCRIBE FUNCTION EXTENDED <函数名>;

例如,查看 concat_ws 的详细说明:

DESCRIBE FUNCTION EXTENDED concat_ws;

这样不仅能看到函数的语法,还能获得一些使用案例和注意事项。


3. 字符串函数详解

字符串函数主要用于对字符数据进行格式化和处理,常见操作包括:

3.1 拼接和截取

  • concat 与 concat_ws
    concat() 将多个字符串直接拼接,例如:

    SELECT concat('Hello', ' ', 'Hive') AS greeting;
    

    concat_ws(sep, str1, str2, …) 使用指定分隔符拼接:

    SELECT concat_ws('-', '2025', '03', '13') AS date_str;
    
  • substr / substring
    用于截取字符串:

    -- 从第 3 个字符开始,截取 4 个字符
    SELECT substr('ApacheHive', 3, 4) AS sub_str;
    -- 支持负数索引(从右边开始计数)
    SELECT substr('ApacheHive', -4, 3) AS sub_str2;
    

3.2 大小写转换与空格处理

  • upper / lower
    将字符串全部转为大写或小写:

    SELECT upper('HiveSQL') AS up_str, lower('HiveSQL') AS low_str;
    
  • trim, ltrim, rtrim, space
    trim() 删除首尾空格;
    ltrim()rtrim() 分别去掉左边或右边的空格;
    space(n) 返回 n 个空格。

    SELECT trim('  abc  ') AS trimmed;
    SELECT space(10) AS spaces;
    

3.3 正则表达式和替换

  • regexp_replace
    根据正则表达式匹配将内容替换:

    SELECT regexp_replace('Hive-123', '\\d+', 'XYZ') AS replaced;
    
  • regexp_extract
    用于提取匹配的子串:

    SELECT regexp_extract('Hive123SQL', '([0-9]+)', 1) AS number_part;
    

3.4 JSON 与 URL 解析

  • get_json_object / json_tuple
    get_json_object(json_str, '$.key') 提取 JSON 对象中指定键的值;
    json_tuple 一次性提取多个键值。

    SELECT get_json_object('{"name": "张三", "age":25}', '$.name') AS name;
    
  • parse_url
    从 URL 中提取 HOST、PATH 或 QUERY 参数:

    SELECT parse_url('https://www.example.com/path?query=1', 'HOST') AS host;
    

4. 数学函数详解

数学函数涵盖了数值运算的各个方面,包括基本运算、取整、对数和幂运算等。

4.1 基本运算

  • 加、减、乘、除
    例如:
    SELECT 10 + 5 AS sum_result, 10 - 5 AS sub_result,
           10 * 5 AS mul_result, 10 / 5 AS div_result;
    
    Hive 对数值类型的运算有精度要求,除法结果始终为 double。

4.2 取整函数

  • round()
    四舍五入函数:

    SELECT round(3.1415926, 2) AS round_val;
    
  • floor() 与 ceil()/ceiling()
    分别向下和向上取整:

    SELECT floor(3.9) AS floor_val, ceil(3.1) AS ceil_val;
    

4.3 其它数学运算

  • rand() 生成 0~1 之间随机数,可传种子保持序列稳定。
  • pow() / power() 计算幂:
    SELECT power(2, 3) AS power_val;
    
  • sqrt() 计算平方根:
    SELECT sqrt(16) AS sqrt_val;
    
  • conv() 进制转换,例如十进制转十六进制:
    SELECT conv(17, 10, 16) AS hex_val;
    
  • abs()、greatest()、least() 用于取绝对值、求最大/最小值等操作。

5. 日期函数详解

日期函数用于将时间戳与字符串之间进行转换、格式化及日期计算。

5.1 时间戳转换

  • unix_timestamp() 与 from_unixtime()
    unix_timestamp('2025-03-13 12:34:56') 将日期转换成从 1970-01-01 起的秒数;
    from_unixtime(秒值, '格式') 将秒值转换为指定格式的字符串。
    SELECT from_unixtime(unix_timestamp('2025-03-13 12:34:56'),'yyyy-MM-dd HH:mm:ss') AS formatted_dt;
    

5.2 日期格式转换与提取

  • to_date() 仅提取日期部分:
    SELECT to_date('2025-03-13 12:34:56') AS date_part;
    
  • year, month, day, hour, minute, second 分别提取时间各部分:
    SELECT year('2025-03-13 12:34:56') AS y, month('2025-03-13 12:34:56') AS m;
    

5.3 日期计算

  • date_add() 与 date_sub()
    分别对日期进行天数加减:
    SELECT date_add('2025-03-13', 7) AS next_week,
           date_sub('2025-03-13', 7) AS last_week;
    
  • datediff() 计算两个日期之间的天数差:
    SELECT datediff('2025-03-20','2025-03-13') AS diff_days;
    

5.4 高级日期函数

  • add_months() 按月增加日期(注意月末处理):
    SELECT add_months('2025-01-31', 1) AS next_month;
    
  • last_day() 返回当月最后一天:
    SELECT last_day('2025-03-13') AS last_day;
    
  • next_day() 返回指定日期之后的下一个特定星期几:
    SELECT next_day('2025-03-13', 'TU') AS next_tuesday;
    
  • trunc() 将日期截断到指定粒度(如年月或月份):
    SELECT trunc('2025-03-13 15:20:30', 'MM') AS month_begin;
    
  • months_between() 计算两个日期之间的月数差(可能为小数)。

6. 条件函数详解

条件函数用于在查询中实现逻辑判断,常见有 if、nvl、coalesce 和 CASE。

6.1 if 函数

if 函数类似三元运算符:

SELECT if(salary > 5000, '高收入', '低收入') AS income_level FROM employee;

6.2 nvl 与 coalesce

  • nvl(a, b) 当 a 为 null 时返回 b,否则返回 a。
  • coalesce(a, b, …) 返回第一个不为 null 的值。
SELECT nvl(null, '默认值') AS result,
       coalesce(null, '', '有效') AS coalesce_result;

6.3 CASE 表达式

CASE 表达式可以分为两种形式:

  • 条件判断形式
    SELECT CASE 
             WHEN score >= 90 THEN '优秀'
             WHEN score >= 60 THEN '及格'
             ELSE '不及格'
           END AS grade
    FROM exam_results;
    
  • 值匹配形式
    SELECT CASE job 
             WHEN 'SALESMAN' THEN '销售员'
             WHEN 'MANAGER' THEN '管理人员'
             ELSE '其他'
           END AS job_china
    FROM employee;
    

7. 聚合函数与窗口函数

7.1 聚合函数

常用的聚合函数有:

  • count, sum, avg, min, max
    常与 GROUP BY 一起使用:
    SELECT dept, count(*) AS emp_count, avg(salary) AS avg_salary
    FROM employee
    GROUP BY dept;
    

7.2 窗口函数

窗口函数允许在不改变原始行数的前提下,对每个分组内的行进行排序、累计或排名。
常见的窗口函数包括:

  • sum() over()
    累计求和:
    SELECT emp_id, salary,
           sum(salary) OVER (PARTITION BY dept ORDER BY emp_id) AS cumulative_salary
    FROM employee;
    
  • row_number(), rank(), dense_rank()
    用于分组内排序和排名:
    SELECT emp_id, salary,
           row_number() OVER (ORDER BY salary DESC) AS rn
    FROM employee;
    
  • lag() 与 lead()
    用于获取当前行之前或之后某行的值:
    SELECT emp_id, salary,
           lag(salary, 1, 0) OVER (ORDER BY emp_id) AS prev_salary,
           lead(salary, 1, 0) OVER (ORDER BY emp_id) AS next_salary
    FROM employee;
    

8. 表生成函数(UDTF)详解

UDTF 允许你将一行数据拆分为多行,常用的函数有 explode、posexplode、json_tuple、stack 等。

8.1 explode 与 lateral view

  • explode(array)
    将数组拆分为多行:

    SELECT explode(array('A', 'B', 'C')) AS letter;
    

    如果需要将拆分结果与原表结合,可使用 lateral view:

    SELECT t.team, tf.col AS year
    FROM teams t
    LATERAL VIEW explode(split(t.years, ',')) tf AS col;
    
  • json_tuple
    用于将 JSON 字符串拆分成多个字段,一次返回多个键对应的值:

    SELECT json_tuple('{"name":"张三","age":25}', 'name', 'age') AS (name, age);
    

9. 用户自定义函数扩展

当 Hive 内置函数不能满足业务需求时,你可以通过以下三种方式扩展:

  • UDF:一进一出函数,例如将字符串转换为小写并附加特定后缀。
  • UDAF:聚合函数,处理多行数据后输出一个结果,如自定义计算中位数。
  • UDTF:将一行拆分成多行,如自定义解析复杂字符串或 JSON 数组。

开发流程通常包括:

  1. 在 Java 中继承相应的基类(如 UDF、GenericUDF、UDAF、UDTF 等)。
  2. 实现相应的 evaluate() 方法(或其他接口方法)。
  3. 编译打包为 JAR 后,通过 ADD JARCREATE TEMPORARY FUNCTION 注册到 Hive 中。

10. 参考与实战案例

以下几篇博客和专栏提供了大量详细案例和源码解析:

  • CSDN 博客《Hive常用函数的说明介绍及其使用》
  • 博客园《Hive常用函数大全》【citeturn0search1】
  • 知乎专栏《大数据开发之Hive篇6-Hive函数详解》

这些资源中不仅有函数语法说明,还提供了具体业务场景中的使用示例和注意事项。


总结

Hive 内置函数的种类十分丰富,涵盖了字符串处理、数学计算、日期转换、条件判断、聚合统计、集合和复合类型操作、表生成以及窗口分析等各个方面。

  1. 使用方法:通过 SHOW FUNCTIONS 与 DESCRIBE FUNCTION EXTENDED 查看可用函数和使用说明;
  2. 示例应用:在实际查询中,可以结合 GROUP BY、lateral view、OVER 子句等使用,满足复杂的数据处理需求;
  3. 扩展性:当内置函数不足时,可以通过自定义 UDF/UDAF/UDTF 实现更复杂的业务逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追梦No1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值