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 基本运算
- 加、减、乘、除
例如:
Hive 对数值类型的运算有精度要求,除法结果始终为 double。SELECT 10 + 5 AS sum_result, 10 - 5 AS sub_result, 10 * 5 AS mul_result, 10 / 5 AS div_result;
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 数组。
开发流程通常包括:
- 在 Java 中继承相应的基类(如 UDF、GenericUDF、UDAF、UDTF 等)。
- 实现相应的 evaluate() 方法(或其他接口方法)。
- 编译打包为 JAR 后,通过
ADD JAR
和CREATE TEMPORARY FUNCTION
注册到 Hive 中。
10. 参考与实战案例
以下几篇博客和专栏提供了大量详细案例和源码解析:
- CSDN 博客《Hive常用函数的说明介绍及其使用》
- 博客园《Hive常用函数大全》【citeturn0search1】
- 知乎专栏《大数据开发之Hive篇6-Hive函数详解》
这些资源中不仅有函数语法说明,还提供了具体业务场景中的使用示例和注意事项。
总结
Hive 内置函数的种类十分丰富,涵盖了字符串处理、数学计算、日期转换、条件判断、聚合统计、集合和复合类型操作、表生成以及窗口分析等各个方面。
- 使用方法:通过 SHOW FUNCTIONS 与 DESCRIBE FUNCTION EXTENDED 查看可用函数和使用说明;
- 示例应用:在实际查询中,可以结合 GROUP BY、lateral view、OVER 子句等使用,满足复杂的数据处理需求;
- 扩展性:当内置函数不足时,可以通过自定义 UDF/UDAF/UDTF 实现更复杂的业务逻辑。