【大数据入门 | Hive】函数{单行函数,集合函数,炸裂函数,窗口函数}
1. 函数简介:
Hive会将常用的逻辑封装成函数给用户进行使用,类似于Java中的函数。
好处:避免用户反复写逻辑,可以直接拿来使用。
重点:用户需要知道函数叫什么,能做什么。
Hive提供了大量的内置函数,按照其特点可大致分为如下几类:单行函数、聚合函数、炸裂函数、窗口函数。
以下命令可用于查询所有内置函数的相关信息。
1)查看系统内置函数
hive> show functions;
2)查看内置函数用法
hive> desc function upper;
3)查看内置函数详细信息
hive> desc function extended upper;
2. 单行函数
单行函数的特点是一进一出,即输入一行,输出一行。
单行函数按照功能可分为如下几类: 日期函数、字符串函数、集合函数、数学函数、流程控制函数等。
2.1 算术运算函数

2.2 数值函数
1)round:四舍五入
hive> select round(3.3); 3
2)ceil:向上取整
hive> select ceil(3.1) ; 4
3)floor:向下取整
hive> select floor(4.8); 4
2.3 字符串函数
1)substring:截取字符串
语法一:substring(string A, int start)
返回值:string
说明:返回字符串A从start位置到结尾的字符串
语法二:substring(string A, int start, int len)
返回值:string
说明:返回字符串A从start位置开始,长度为len的字符串
2)replace :替换
语法:replace(string A, string B, string C)
返回值:string
说明:将字符串A中的子字符串B替换为C。
hive> select replace('atguigu', 'a', 'A')
3)regexp_replace:正则替换
语法:regexp_replace(string A, string B, string C)
返回值:string
说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符。
hive> select regexp_replace('100-200', '(\\d+)', 'num')
4)regexp:正则匹配
语法:字符串 regexp 正则表达式
返回值:boolean
说明:若字符串符合正则表达式,则返回true,否则返回false。
(1)正则匹配成功,输出true
hive> select 'dfsaaaa' regexp 'dfsa+'
(2)正则匹配失败,输出false
5)repeat:重复字符串
语法:repeat(string A, int n)
返回值:string
说明:将字符串A重复n遍。
hive> select repeat('123', 3);hive> 123123123
6)split :字符串切割
语法:split(string str, string pat)
返回值:array
说明:按照正则表达式pat匹配到的内容分割str,分割后的字符串,以数组的形式返回。
hive> select split('a-b-c-d','-');hive> ["a","b","c","d"]
7)nvl :替换null值
语法:nvl(A,B)
说明:若A的值不为null,则返回A,否则返回B。
hive> select nvl(null,1); hive> 1
8)concat :拼接字符串
语法:concat(string A, string B, string C, ……)
返回:string
说明:将A,B,C……等字符拼接为一个字符串
hive> select concat('beijing','-','shanghai','-','shenzhen');hive> beijing-shanghai-shenzhen
9)concat_ws:以指定分隔符拼接字符串或者字符串数组
语法:concat_ws(string A, string…| array(string))
返回值:string
说明:使用分隔符A拼接多个字符串,或者一个数组的所有元素。
hive>select concat_ws('-','beijing','shanghai','shenzhen');hive> beijing-shanghai-shenzhen
10)get_json_object:解析json字符串
语法:get_json_object(string json_string, string path)
返回值:string
说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。
2.4 日期函数
1)unix_timestamp:返回当前或指定时间的时间戳
语法:unix_timestamp()
返回值:bigint
案例实操:
hive> select unix_timestamp('2022/08/08 08-08-08','yyyy/MM/dd HH-mm-ss'); 1659946088
2)from_unixtime:转化UNIX时间戳(从 1970-01-01 00:00:00 UTC 到指定时间的秒数)到当前时区的时间格式
语法:from_unixtime(bigint unixtime[, string format])
返回值:string
案例实操:
hive> select from_unixtime(1659946088); 2022-08-08 08:08:08
3)current_date:当前日期
hive> select current_date; 2022-07-11
4)current_timestamp:当前的日期加时间,并且精确的毫秒
hive> select current_timestamp; 2022-07-11 15:32:22.402
5)month:获取日期中的月
语法:month (string date)
hive> select day('2022-08-08 08:08:08') 8
返回值:int
案例实操:
hive> select month('2022-08-08 08:08:08');8
6)day:获取日期中的日
语法:day (string date)
返回值:int
案例实操:
hive> select day('2022-08-08 08:08:08') 8
7)hour:获取日期中的小时
语法:hour (string date)
返回值:int
案例实操:
hive> select hour('2022-08-08 08:08:08'); 8
8)datediff:两个日期相差的天数(结束日期减去开始日期的天数)
语法:datediff(string enddate, string startdate)
返回值:int
案例实操:
hive> select datediff('2021-08-08','2022-10-09'); -427
9)date_add:日期加天数
语法:date_add(string startdate, int days)
返回值:string
说明:返回开始日期 startdate 增加 days 天后的日期
案例实操:
hive> select date_add('2022-08-08',2); 2022-08-10
10)date_sub:日期减天数
语法:date_sub (string startdate, int days)
返回值:string
说明:返回开始日期startdate减少days天后的日期。
案例实操:
hive> select date_sub('2022-08-08',2); 2022-08-06
11)date_format:将标准日期解析成指定格式字符串
hive> select date_format('2022-08-08','yyyy年-MM月-dd日') 2022年-08月-08日
2.5 流程控制函数
1)case when:条件判断函数
语法一:case when a then b [when c then d]* [else e] end
返回值:T
说明:如果a为true,则返回b;如果c为true,则返回d;否则返回 e
hive> select case when 1=2 then 'tom' when 2=2 then 'mary' else 'tim' end from tabl eName;
mary
语法二: case a when b then c [when d then e]* [else f] end
返回值: T
说明:如果a等于b,那么返回c;如果a等于d,那么返回e;否则返回f
hive> select case 100 when 50 then 'tom' when 100 then 'mary' else 'tim' end from t ableName;
mary
2)if: 条件判断,类似于Java中三元运算符
语法:if(boolean testCondition, T valueTrue, T valueFalseOrNull)
返回值:T
说明:当条件testCondition为true时,返回valueTrue;否则返回valueFalseOrNull
(1)条件满足,输出正确
hive> select if(10 > 5,'正确','错误');
(2)条件满足,输出错误
hive> select if(10 < 5,'正确','错误');
3. 集合函数
1)size:集合中元素的个数
hive> select size(friends) from test; --2/2 每一行数据中的friends集合里的个数
2)map:创建map集合
语法:map (key1, value1, key2, value2, …)
说明:根据输入的key和value对构建map类型
案例实操:
hive> select map('xiaohai',1,'dahai',2); hive> {"xiaohai":1,"dahai":2}
3)map_keys: 返回map中的key
hive> select map_keys(map('xiaohai',1,'dahai',2));hive>["xiaohai","dahai"]
4)map_values: 返回map中的value
hive> select map_values(map('xiaohai',1,'dahai',2));hive>[1,2]
5)array 声明array集合
语法:array(val1, val2, …)
说明:根据输入的参数构建数组array类
案例实操:
hive> select array('1','2','3','4');hive>["1","2","3","4"]
6)array_contains: 判断array中是否包含某个元素
hive> select array_contains(array('a','b','c','d'),'a');hive> true
7)sort_array:将array中的元素排序
hive> select sort_array(array('a','d','c'));hive> ["a","c","d"]
8)struct声明struct中的各属性
语法:struct(val1, val2, val3, …)
说明:根据输入的参数构建结构体struct类
案例实操:
hive> select struct('name','age','weight');hive> {"col1":"name","col2":"age","col3":"weight"}
9)named_struct声明struct的属性和值
hive> select named_struct('name','xiaosong','age',18,'weight',80);hive> {"name":"xiaosong","age":18,"weight":80}
4. 高级聚合函数
多进一出 (多行传入,一个行输出)。
1)普通聚合 count/sum
2)collect_list 收集并形成list集合,结果不去重
hive>
select sex,collect_list(job)
fromemployee
group by sex女 ["行政","研发","行政","前台"]
男 ["销售","研发","销售","前台"]
3)collect_set 收集并形成set集合,结果去重
5. 炸裂函数
定义:UDTF(table-generating functions)
接收一行数据,输出一行或多行数据。

在Hive SQL中,处理数组或映射类型的“炸裂”通常涉及到将这些复杂类型的数据展开成多行或多列。Hive 提供了一些内置函数来帮助实现这一操作,特别是对于数组和映射类型。这里是一些常用的函数和示例:
5.1 使用lateral view和explode()
`explode()` 函数可以用来展开数组或映射类型中的元素。`LATERAL VIEW` 用于将这些展开的元素转换为单独的行。
对于数组
假设你有一个表 `orders`,其中包含一个名为 `items` 的数组字段,每个订单可能有多个项目。
CREATE TABLE orders (order_id INT,items ARRAY<STRING>
);-- 插入一些数据
INSERT INTO orders VALUES (1, array('item1', 'item2'));
INSERT INTO orders VALUES (2, array('item3'));-- 展开数组
SELECT order_id, item
FROM orders
LATERAL VIEW explode(items) exploded_table AS item;order_id | item
---------|------
1 | item1
1 | item2
2 | item3
```
对于映射
如果 `items` 是一个映射类型,你可以使用 `explode()` 来展开键值对。
CREATE TABLE orders (order_id INT,items MAP<STRING, INT> -- 假设这是商品名到数量的映射
);-- 插入一些数据
INSERT INTO orders VALUES (1, map('item1', 2, 'item2', 3));
INSERT INTO orders VALUES (2, map('item3', 1));-- 展开映射
SELECT order_id, key, value
FROM orders
LATERAL VIEW explode(items) exploded_table AS key, value;
```这将产生如下结果:
```
order_id | key | value
---------|-------|------
1 | item1 | 2
1 | item2 | 3
2 | item3 | 1
```
5.2 使用 `LATERAL VIEW` 和 `posexplode()`
如果你需要保留数组元素的位置信息,可以使用 `posexplode()` 函数。
-- 展开数组并获取位置
SELECT order_id, pos, item
FROM orders
LATERAL VIEW posexplode(items) exploded_table AS pos, item;
```这将产生如下结果(包含元素的位置):
```
order_id | pos | item
---------|-----|------
1 | 0 | item1
1 | 1 | item2
2 | 0 | item3
5.3 使用 `LATERAL VIEW` 和 `inline()`
`inline()` 函数可以用于展开结构化的数组,例如包含多个字段的数组。
CREATE TABLE orders (order_id INT,items ARRAY<STRUCT<name: STRING, quantity: INT>>
);-- 插入一些数据
INSERT INTO orders VALUES (1, array(named_struct('name', 'item1', 'quantity', 2), named_struct('name', 'item2', 'quantity', 3)));
INSERT INTO orders VALUES (2, array(named_struct('name', 'item3', 'quantity', 1)));-- 展开结构化数组
SELECT order_id, i.name, i.quantity
FROM orders
LATERAL VIEW inline(items) exploded_table AS i;
```这将产生如下结果:
```
order_id | name | quantity
---------|-------|---------
1 | item1 | 2
1 | item2 | 3
2 | item3 | 1
6. 窗口函数
定义:窗口函数,能为每行数据划分一个窗口,然后对窗口范围内的数据进行计算,最后将计算结果返回给该行数据。

6.1 常见窗口函数
按照功能,常用窗口可划分为如下几类:聚合函数、跨行取值函数、排名函数。
1)聚合函数
max:最大值。
min:最小值。
sum:求和。
avg:平均值。
count:计数。
2)跨行取值函数
(1)lead和lag

注:lag和lead函数不支持自定义窗口。
(2)first_value和last_value

3)排名函数
rank 、dense_rank、row_number不支持自定义窗口。

相关文章:
【大数据入门 | Hive】函数{单行函数,集合函数,炸裂函数,窗口函数}
1. 函数简介: Hive会将常用的逻辑封装成函数给用户进行使用,类似于Java中的函数。 好处:避免用户反复写逻辑,可以直接拿来使用。 重点:用户需要知道函数叫什么,能做什么。 Hive提供了大量的内置函数&am…...
python sqlite3 工具函数
起因, 目的: sqlite3 最常用的函数。 比如,某人给了一个 database.db 文件。 但是你登录的时候,不知道账号密码。 此文件就是,查看这个数据库的详细内容。 有哪些表某个表的全部内容。添加数据 代码, 见注释 impor…...
顺丰Android面试题集锦及参考答案
TCP 三次握手和四次挥手是什么,挥手过程中主动方的状态是什么? TCP 三次握手是建立连接的过程: 第一次握手:客户端向服务器发送一个 SYN 报文,该报文包含客户端的初始序列号(seq=x)。此时客户端进入 SYN_SENT 状态。第二次握手:服务器收到客户端的 SYN 报文后,向客户端…...
uniapp中检测应用更新的两种方式-升级中心之uni-upgrade-center-app
uniapp一个很是用的功能,就是在我们发布新版本的app后,需要提示用户进行app更新,并告知用户我们新版的app更新信息,以使得用户能及时使用上我们新开发的功能,提升用户的实用度和粘性。注意:这个功能只能在app端使用 效…...
Python爬虫通过 Cookie 和会话管理来维持其在网站上的会话状态
Python 爬虫虽然是一个热门且非常实用的技术领域,但在实际开发中,确实存在一些困难的地方。以下是 Python 爬虫开发中常见的难点和挑战: 1. 处理反爬虫机制 许多网站为防止爬虫的恶意访问,采取了各种反爬虫措施。常见的反爬虫技…...
使用STM32单片机实现无人机控制系统
无人机控制系统是无人机的大脑,负责处理无人机的姿态控制、导航和通信等功能。本文将详细介绍如何使用STM32单片机实现无人机控制系统,包括硬件设计、软件设计、系统调试与测试等内容。 一、系统概述 无人机控制系统通常包括飞行控制器、传感器、执行器…...
【包教包会】2D图片实现3D透视效果(支持3.x、支持原生、可合批)
将去年写的SpriteFlipper从2.x升级到3.x。 如果需要2.x版本或需要了解算法思路,请移步:https://blog.csdn.net/weixin_42714632/article/details/136745051 优化功能:可同时绕X轴和Y轴旋转,两者效果会叠加。 完美适配Web、原生…...
解决nginx+tomcat宕机完美解决方案
问题描述:公司项目太老了,还是tomcat项目,部署两台tomcat,做了nginx负载。最近发现每到上午10,下午3点,tomcat就宕机了,死活找不到原因,客户影响超期差,实在让人头疼。 解决思路&am…...
第十一章 缓存之更新/穿透/雪崩/击穿
目录 一、什么是缓存 二、缓存更新策略 2.1. 缓存主动更新策略 2.1.1. Cache Aside模式(主流) 2.1.2. Read/Write Through模式 2.1.3. Write Behind模式 2.1.4. 总结 三、缓存穿透 四、缓存雪崩 五、缓存击穿 5.1. 互斥锁实现 5.1.1…...
一款完全开源并免费的监测与分析系统,支持监测,预警,分析,报告,支持本地化部署(附源码)
前言 在当今这个信息爆炸的时代,企业和个人都需要时刻了解网络上的动态,以便及时了解自身品牌形象和社会舆论的变化。然而,现有的舆情监测工具往往价格昂贵,且cao作复杂,难以满足普通用户的需求。 在这种背景下&…...
python中时间函数及其应用
近段时间,因在改写以前写的学校自动铃声控制系统,又学到了一些新的知识,特记录如下: 一、时间函数基础 1、time模块中的函数及其用法 time.time(): 返回当前时间的时间戳,即自1970年1月1日以来的秒数。 time.localt…...
MoveIt2-humble】入门教程----第一个 C++ MoveIt 程序
四节教程会手把手带你写一个完整的 Moveit 控制程序,包括轨迹规划、RViz可视化、添加碰撞物体、抓取和放置。 1 创建依赖包 进入到教程所在工作空间下的src目录,创建一个新的依赖包。 ros2 pkg create \--build-type ament_cmake \--dependencies mov…...
watch命令:周期执行指定命令
一、命令简介 watch 命令用于周期性地执行指定的命令,并显示其输出结果。 二、命令参数 2.1 命令格式 watch [选项] 命令2.2 选项 -n, --interval: 指定更新间隔时间(以秒为单位)。默认间隔时间为 2 秒。-d, --difference…...
【ADC】噪声(1)噪声分类
概述 本文学习于TI 高精度实验室课程,总结 ADC 的噪声分类,并简要介绍量化噪声和热噪声。 文章目录 概述一、ADC 中的噪声类型二、量化噪声三、热噪声四、量化噪声与热噪声对比 一、ADC 中的噪声类型 ADC 固有噪声由两部分组成:第一部分是量…...
网络安全概述:从认知到实践
一、定义 网络安全,即致力于保护网络系统所涵盖的硬件、软件以及各类数据,切实保障其免遭破坏、泄露或者篡改等不良情形的发生。 二、重要性 个人层面:着重于守护个人隐私以及财产安全,为个人在网络世界中的各项活动提供坚实的保…...
Vue.js组件开发研究
摘要 随着前端技术的快速发展,Vue.js以其轻量级、高性能和组件化开发的优势,在前端开发领域占据了重要地位。本研究深入探讨了Vue.js组件开发的理论基础、开发方法以及实际应用。通过系统梳理Vue.js框架的核心特性、组件化思想及Vue.js组件的基本概念&am…...
OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植案例(一)
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 轻量带屏解决方案之恒玄芯片移植案例 本文章基于恒玄科技BES2600W…...
【Llamaindex RAG实践】
基础任务 (完成此任务即完成闯关) 任务要求:基于 LlamaIndex 构建自己的 RAG 知识库,寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答,借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力,截…...
[Linux]:线程(三)
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. POSIX 信号量 1.1 信号量的概念 为了解决多执行流访问临界区,…...
云原生(四十一) | 阿里云ECS服务器介绍
文章目录 阿里云ECS服务器介绍 一、云计算概述 二、什么是公有云 三、公有云优缺点 1、优点 2、缺点 四、公有云品牌 五、市场占有率 六、阿里云ECS概述 七、阿里云ECS特点 阿里云ECS服务器介绍 一、云计算概述 云计算是一种按使用量付费的模式,这种模式…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
