Hive 函数学习笔记(上):单行函数与炸裂函数

本文基于 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 窗口函数、行列转换、连续登录 等经典问题。

相关推荐
喜欢打篮球的普通人2 小时前
MiniMind 学习笔记(十八):速通强化学习——从 MDP 到 PPO 的概念与算法地图
笔记·深度学习·学习
志尊宝3 小时前
Vue3 零基础每日笔记(076):防抖节流的正确使用——搜索框、按钮防重复提交、滚动监听
javascript·vue.js·笔记
老王爱玩车3 小时前
动态内存管理
c语言·开发语言·学习·面试
海绵宝宝转agent3 小时前
2026-10-9 leetcode100刷题+面经整理
笔记·算法·面试
yi0113 小时前
DAY24: LeetCode 167:两数之和 II|从暴力枚举到左右双指针
笔记·python·算法·leetcode·二分查找·双指针
yi0114 小时前
LeetCode 15:三数之和|排序 + 双指针,如何避免重复答案?
笔记·python·算法·leetcode·双指针
北风toto4 小时前
数据库笔记:Armstrong 公理系统与集合论的深度辨析
数据库·笔记
EasyBr指纹浏览器4 小时前
我的开源项目:小红书笔记归档,把来源和缺项一起留下
笔记·小红书·开源工具·素材管理·内容归档
海海不掉头发4 小时前
图论及其应用_课堂笔记整理_CSDN博客
笔记·图论