本文基于 Hive 官方 UDF 文档整理,涵盖 Hive 内置函数分类、单行函数以及炸裂函数(UDTF)的常用语法与案例。 官方文档:Apache Hive : LanguageManual UDF
一、Hive 内置函数总览
Hive 内置函数大致可以分为:单行函数、聚合函数、炸裂函数、窗口函数。
-- 查看 Hive 系统的内置函数
SHOW FUNCTIONS;
-- 查看内置函数用法
DESC FUNCTION xxxxx;
-- 查看内置函数的详细信息
DESC FUNCTION EXTENDED day;
二、单行函数
特点: 一进一出,即输入一行,输出一行。 分类: 日期函数、字符串函数、集合函数、数学函数、流程控制函数。 算术运算函数: +、-、*、/、%、&、|、^、~
&:A&B,A 和 B 按位取与|:A|B,A 和 B 按位取或^:A^B,A 和 B 按位取异或~:~A,A 按位取反
(1)数学函数
-- round:四舍五入
round(DOUBLE a)
round(DOUBLE a, INT d)
-- ceil:向上取整
ceil(DOUBLE a), ceiling(DOUBLE a)
-- floor:向下取整
floor(DOUBLE a)
案例:
SELECT round(3.1425926);
SELECT round(3.1425926,2);
SELECT ceil(3.14);
SELECT floor(3.5);
SELECT
round(avg(sal),2) AS avg_sal
FROM
emp;
(2)集合函数
创建复杂数据类型表:
CREATE TABLE test_tbl1(
name STRING,
friends ARRAY<STRING>,
students MAP<STRING,INT>,
address STRUCT<street:STRING,city:STRING,code:INT>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t' -- 行分隔符
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
数据:
zhangsan zhangsan1,zhangsan2 lisi1:18,lisi2:20 shushanqu,hefei,230001
zhangsan ["zhangsan1","zhangsan2"] {"lisi1":18,"lisi2":20} {"street":"shushanqu","city":"hefei","code":230001}
size:返回元素数量
size(Map<KV>)
size(Array<T>)
SELECT
size(friends) AS friends_num
FROM
test_tbl1;
SELECT
size(students) AS students_num
FROM
test_tbl1;
map
map_keys(Map<KV>): 返回一个包含输入映射键的无序数组。
map_values(Map<KV>): 返回一个包含输入映射值的无序数组。
-- 创建 map 集合
SELECT map('name','zhangsan','age','20');
SELECT map_keys(map('name','zhangsan','age','20')); -- ["name","age"]
SELECT
map_keys(students)
FROM
test_tbl1;
SELECT map_values(map('name','zhangsan','age','20'));
SELECT
map_values(students)
FROM
test_tbl1;
array 集合
array_contains(Array<T>, value): 如果数组包含值,则返回 TRUE。
SELECT array(1,2,3,4,5);
SELECT array_contains(array(1,2,3,4,5),4);
SELECT
array_contains(friends,"zhangsan1")
FROM
test_tbl1;
sort_array(Array<T>): 根据数组元素的自然顺序,按升序对输入数组进行排序并返回结果
SELECT sort_array(array(1,2,5,4,3)); -- 不支持降序!!!
struct
SELECT struct('name','age','sex'); -- 声明属性
-- 声明属性和值
SELECT named_struct('name','zhangsan','age','20');
(3)日期函数
-- unix_timestamp:返回当前或指定时间的时间戳
-- 返回值:bigint
-- 参数:date:日期
-- pattern:日期格式
unix_timestamp()
unix_timestamp(string date)
unix_timestamp(string date, string pattern)
SELECT unix_timestamp('2026/09/29 10-33-15','yyyy/MM/dd HH-mm-ss');
-- from_unixtime:转换 unix 时间戳
from_unixtime(bigint unixtime[, string pattern])
SELECT from_unixtime(1790677995,'yyyy/MM/dd');
-- current_date:当前时间
current_date
SELECT current_date; -- 年月日
-- current_timestamp:当前日期加时间,并且精确到毫秒
current_timestamp
SELECT current_timestamp;
-- month:获取日期中的月
month(string date)
SELECT month('2026-09-29 10:30:10');
-- day:获取日期中的日
day(string date) dayofmonth(date)
SELECT day('2026-09-29 10:30:10');
-- hour:获取日期中的小时
hour(string date)
SELECT hour('2026-09-29 10:30:10');
-- datediff:两个日期相差的天数
datediff(string enddate, string startdate)
SELECT datediff('2026-09-29','2026-07-13'); -- 78
-- date_add:日期加天数,返回开始日期 startdate,增加 days 天后的日期
date_add(date/timestamp/string startdate, tinyint/smallint/int days)
SELECT date_add('2026-09-29',2);
-- date_sub:日期减天数,返回开始日期 startdate,减去 days 天后的日期
date_sub(date/timestamp/string startdate, tinyint/smallint/int days)
SELECT date_sub('2026-09-29',2);
-- date_format:将标准日期解析成指定格式字符串
date_format(date/timestamp/string ts, string pattern)
SELECT date_format('2026-09-29 10:48:29','yyyy年MM月dd日 HH时间mm分ss秒');
(4)字符串函数
-- substring:返回字符串 A 从 start 位置到结尾的字符串。
substring(string A,string start);
SELECT substr('Hadoop',3);
SELECT substring('Hadoop',3);
-- replace:替换,把字符串 A 子字符串 OLD,替换为 NEW
replace(string A, string OLD, string NEW)
SELECT replace('lanzhishujiaxueyuan','xueyuan','daxue');
-- regexp_replace:正则替换,将字符串中 A 符合正则表达式 B 的部分替换为 C
-- 注意:在某些情况下需要进行转义字符
regexp_replace(string A, string B, string C)
SELECT regexp_replace('400-500','(\d+)','hadoop'); -- hadoop-hadoop
-- REGEXP:正则匹配,如果字符串符合正则表达式则返回 true,否则返回 false
A REGEXP B
SELECT 'abcdfhhejkosajkdhhkwfthiqk' REGEXP 'h+';
-- repeat:重复字符串,将 str 重复 n 遍
repeat(string str, int n)
SELECT repeat('我喜欢你',100);
-- split:字符串切割,按正则表达式 pat 匹配到的内容分割 str,分割后的字符串以数组形式返回
split(string str, string pat)
SELECT split('h-a-d-o-o-p','-');
-- nvl:替换空值,如果 A 不为 null,则返回 A,否则返回 B
nvl(A, B)
SELECT nvl('我想放假!',1);
-- concat:拼接字符串
concat(String A,String B,....)
SELECT concat("anhui","-","hefei","-","shushanqu");
-- concat_ws:以指定分隔符拼接字符串或者字符数组
concat_ws(string SEP, string A, string B...)
SELECT concat_ws("-","anhui","hefei","shushanqu");
SELECT concat_ws("-",array("2026","9","29"));
-- get_json_object:解析 json 字符串
get_json_object(string json_string, string path)
{
"name": "zhangsan",
"friends": ["zhangsan1", "zhangsan2"],
"scores": {
"lisi1": 18,
"lisi2": 20
},
"address": {
"street": "shushanqu",
"city": "hefei",
"code": 230001
}
}
SELECT get_json_object('{"name":"zhangsan","friends":["zhangsan1","zhangsan2"],"scores":{"lisi1":18,"lisi2":20},"address":{"street":"shushanqu","city":"hefei","code":230001}}',"$.scores.lisi1");
(5)流程控制函数
① CASE WHEN:条件判断函数
语法格式 1: 如果 a=b,那么返回 c;如果 a=d,那么返回 e,否则返回 f
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
语法格式 2: 如果 a 为 true 则返回 b,如果 c 为 true 则返回 d,否则返回 e
CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END
SELECT CASE WHEN 1=2 THEN "zhangsan"
WHEN 2=2 THEN "lisi"
ELSE "shujia" END;
SELECT CASE 100 WHEN 50 THEN "zhangsan"
WHEN 100 THEN "lisi"
ELSE "lanhi" END;
② IF:条件判断
当条件 testCondition 为 true,则返回 valueTrue,否则返回 valueFalseOrNull。
if(boolean testCondition, T valueTrue, T valueFalseOrNull)
-- (a > b)? a : b
SELECT if(10 > 5,'正确','错误');
(6)炸裂函数
1. explode:一行转成多行
SELECT explode(array(1,2,3,4,5,6,7));
案例:wordcount
CREATE TABLE lines(
line STRING
);
INSERT INTO lines VALUES
('java,python,hive,spark'),
('hadoop,hdfs,mapreduce,yarn'),
('c,python,hive,spark'),
('java,pytsparkhon,hive,spark'),
('java,python,hive,flink'),
('java,python,hive,spark');
SELECT split(line,',') FROM lines;
SELECT explode(split(line,',')) FROM lines;
SELECT
word,
COUNT(1) AS num
FROM
(
SELECT
explode(split(line,',')) AS word
FROM lines
) AS a
GROUP BY word;
班级性别转换
SELECT collect_set(gender) FROM students; -- ["0","1"]
-- 0 | 1
SELECT
clazz,
concat_ws('|',collect_set(gender)) AS sexs
FROM students
GROUP BY clazz;
-- 创建表
CREATE TABLE clazz_sex AS
SELECT
clazz,
concat_ws('|',collect_set(gender)) AS sexs
FROM students
GROUP BY clazz;
-- T:虚拟视图别名
SELECT
clazz,
sex
FROM clazz_sex
LATERAL VIEW explode(split(sexs,'|')) T AS sex;
-- LATERAL VIEW 配合 EXPLODE 是 Hive 中列转行(把一行拆成多行)的经典组合
2. posexplode
POSEXPLODE 是 EXPLODE 的增强版,在炸开数组的同时额外返回每个元素的下标(位置索引)。
SELECT posexplode(array(2,3,1,3,21,13,1));
3. inline
INLINE 是 Hive 的一个 UDTF(表生成函数),用于把结构体数组(array<struct>)炸开成多行,并且每个 struct 的字段直接变成一列。
SELECT inline(array(struct('A',10,date'2026-10-01'),struct('B',30,date'2026-10-01')));
4. stack
STACK 是 Hive 的一个 UDTF(表生成函数),用于把多个列的值转成多行,即列转行的一种便捷手段。
SELECT stack(2,'A',10,date '2026-10-01','B',30,date'2026-10-02');
三、总结(上)
本文整理了 Hive 函数的上半部分内容,包括:
- Hive 内置函数的分类与查看方式;
- 单行函数的特点与分类;
- 数学函数、集合函数、日期函数、字符串函数、流程控制函数;
- 炸裂函数:
explode、posexplode、inline、stack; LATERAL VIEW配合EXPLODE实现列转行;- wordcount、班级性别转换等典型案例。
下半部分将继续整理 Hive 窗口函数、行列转换、连续登录 等经典问题。