Hive学习---4、函数(单行函数、高级聚合函数、炸裂函数、窗口函数)

news2024/10/6 4:04:58

1、函数

1.1 函数简介

Hive会将常用的逻辑封装成函数给用户进行使用,类似java中的函数。
好处:避免用户反复写逻辑,可以直接拿来使用
重点:用户需要知道函数叫什么,能做什么

Hive提供了大量的内置函数,按照其特点大致可分为如下几类:单行函数、聚合函数、炸裂函数、窗口函数。

以下命令可用于查询所有内置函数的相关信息

--1、查看系统内置函数
show functions

--2、查看内置函数用法
desc function upper

--3查看内置函数详细信息
desc function extended upper

1.2 单行函数

单行函数的特点是一进一出,即输入一行,输出一行。
单行函数按照功能可分为如下几类:日期函数、字符串函数、集合函数、数学函数、流程控制函数。

1.2.1 算术运算函数
运算符描述
A+BA和B 相加
A-BA减去B
A*BA和B 相乘
A/BA除以B
A%BA对B取余
A&BA和B按位取与
AB
A^BA和B按位取异或
~AA按位取反
--查询出所有员工的薪水后加100显示。
select sal+100 from emp;
1.2.2 数值函数

1、round:四舍五入

select round(3.3) ;   3

2、ceil:向上取整

select ceil(3.1);   4

3、floor:向下取整

select floor(6.8);   6
1.2.3 字符串函数

1、substring:截取字符串

--语法1
--substring(string A,int start)
--返回值:string
--说明:返回字符串A从start位置到结尾的字符串

--(1)获取第二个字符以后得所有字符
select substring("zhmagoodboy",2);  hmagoodboy

--(2)获取倒数第三个字符以后得所有字符
select substring("zhmagoodboy",-3)
boy

--语法2
--substring(string A,int start,int len)
--返回值:string
--说明:返回字符串A从start位置开始,长度为len的字符串

--从第三个字符开始,向后获取2个字符
select substring("zhmagoodboy",3,2)
ma

2、replace:替换

--语法:replace(string A, string B, string C) 
--返回值:string
--说明:将字符串A中的子字符串B替换为C。

select regexp_replace('zhm','h','H')   zHm

3、regexp_replace:正则替换

--语法:regexp_replace(string A,string B,string C)
--返回值:string
--说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符。

select regexp_replace('100-200','(\\d+)','num') num-num

4、regexp:正则匹配

--语法:字符串 regexp 正则表达式
--返回值:boolean
--说明:若字符串符合正则表达式,则返回true,否则返回false。
--(1)正则匹配成功,输出true
select 'dfsaaaa' regexp 'dfsa+'; true

--(2)正则匹配失败,输出false
select 'dfsaaaa' regexp 'dfsb+'; false

5、repeat:重复字符串

--语法:repeat(string A, int n)
--返回值:string
--说明:将字符串A重复n遍。
select repeat('123',2);  123123

6、spilt:字符串切割

--语法:split(string str, string pat) 
--返回值:array
--说明:按照正则表达式pat匹配到的内容分割str,分割后的字符串,以数组的形式返回。
select spilt('a-b-c-d','-');  ["a","b","c","d"]

7、nvl:替换null值

--语法:nvl(A,B) 
--说明:若A的值不为null,则返回A,否则返回B。 
select nvl(null,1);  1

8、concat:拼接字符串

--语法:concat(string A, string B, string C, ……) 
--返回:string
--说明:将A,B,C……等字符拼接为一个字符串

select concat('beijing','-','shanghai','-','shenzhen')  beijing-shanghai-shenzhen

9、concat_ws:以指定分割符拼接字符串或者字符串数组

--语法:concat_ws(string A, string…| array(string)) 
--返回值:string
--说明:使用分隔符A拼接多个字符串,或者一个数组的所有元素。

select concat_ws('-','beijing','shanghai','shenzhen'); beijing-shanghai-shenzhen

10、get_json_object:解析json字符串

--语法:get_json_object(string json_string,string path)
--返回值:string
--说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符无效,那么返回null。

--(1)获取json数组里面取得json具体数据
select get_json_object('[{"name":"邹哥哥","sex":"男","age":"24"},{"name":"邹小哥哥","sex":"男","age":"18"}]','$.[0].name');   邹哥哥

--(2)获取json数组里面的数据
 select get_json_object('[{"name":"邹哥哥","sex":"男","age":"24"},{"name":"邹小哥哥","sex":"男","age":"18"}]','$.[0]');
输出:{"name":"邹哥哥","sex":"男","age":"24"}
1.2.4 日期函数

1、unix_timestamp:返回当前或指定时间的时间戳

--语法:unix_timestamp()
--返回值:bigint
select unix_timestamp('2022/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 
select from_unixtime(1659946088);   
输出:2022-08-08 08:08:08

3、current_date:当前日期

select current_date;  
输出:2023-06-2

4、current_timestamp:当前的日期加时间,并且精确的毫秒

select current_timestamp; 
输出:2023-06-2 15:32:22.402

5、month:获取日期中的月

--语法:month (string date) 
--返回值:int 
select month('2023-06-02 08:08:08');
输出:6

6、day:获取日期中的日

--语法:day (string date) 
--返回值:int 
select day('2023-06-02 08:08:08');
输出:2

7、day:获取日期中的小时

--语法:hour (string date) 
--返回值:int 
select hour('2023-06-02 08:08:08');
输出:8

8、datediff:两个日期相差的天数(结束日期减去开始日期的天数)

--语法:datediff(string enddate, string startdate) 
--返回值:int 
select datediff('2021-08-08','2022-10-09')
输出:-427

9、data_add:日期加天数

--语法:date_add(string startdate, int days) 
--返回值:string 
--说明:返回开始日期 startdate 增加 days 天后的日期
select data_add('2023-06-02',2);
输出:2023-06-04

10、date_sub:日期减天数

--语法:date_sub (string startdate, int days) 
--返回值:string 
--说明:返回开始日期startdate减少days天后的日期。

select data_sub('2023-06-04',2);
输出:2023-06-02

11、date_format:将标准日期解析成指定格式字符串

select date_format('2023-06-02','yyyy年-MM月-dd日')
输出:2023-06-02
1.2.5 流程控制函数

1、case when:条件判断函数

--语法1:case when a then b[when c then d] * [else e] end
--返回值:T
--说明:如果a是true ,则返回b;如果c为true ,则返回d;否则返回e

select case when 1=2 then 'tom' when 2=2 then 'mary' else 'tim' end from table ename;
输出结果:mary

--语法2:case a when b then c [when d then e]*[else f] end
--返回值:T
--说明:如果a等于b,那么返回c;如果a等于d,那么返回e;否则返回f

select case 100 when 50 then 'tom' when 100 then 'mary' 
else 'tim' end from tableName;
输出结果:mary

2、if:条件判断,类型java中的三元运算符

-- 语法:if(boolean testCondition,T valueTrue,T valueFalseOrNull)
-- 返回值:T
-- 说明:当条件testCondition为true时,返回valueTrue;否则返回valueFalseOrNull
--(1)条件满足,输出正确
select if(10>5,'正确','错误');
输出:正确
--(2)条件满足,输出错误
select if(10<5,'正确','错误');
输出:错误
1.2.6 聚合函数

1、size:集合中元素个数

select size(friends) from test;  --2/2  每一行数据中的friends集合里的个数

2、map:创建map集合

--语法:map(key1,value1,key2,value2,...)
--说明:根据输入的key和value对构建map类型
select map('zhm',1,'zhm2',2);
输出:{"zhm":1,"zhm2":2}

3、map_keys:返回map中的key

select map_keys(map('zhm',1,'zhm2',2))
输出:["zhm","zhm1"]

4、map_keys:返回map中的key

select map_values(map('zhm',1,'zhm2',2))
输出:[1,2]

5、array声明array集合

--语法:array(val1,val2,...)
--说明:根据输入的参数构建数组array类
select array('1','2','3','4');
输出:["1","2","3","4"]

6、array_contains:判断array中是否包含某元素

select array_contains(array('a','b','c'),'a');
输出:true

7、sort_array:将array中的元素排序

select sort_array(array('a','d','c'))
输出:['a','c','d']

8、struct声明struct中的各属性

--语法:struct(val1,val2,val3,...)
--说明:根据输入的参数构建结构体struct类
select struct('name','age','weight');
输出:{"col1":"name","col2":"age","col3":"weight"}

9、named_struct声明struct的属性和值

select named_strcut('name','zhm','age',18,'weight',80);
输出:{"name":"zhm","age":18,"weight":80}

1.3 高级聚合函数

多进一出(多行传入,一行输出)
1、collect_list() 收集并形成list集合,结果不去重

select 
  sex,
  collect_list(job)
from employee
group by  sex

结果:
女 [“行政”,“研发”,“行政”,“前台”]
男 [“销售”,“研发”,“销售”,“前台”]

2、collect_set() 收集并形成set集合,结果去重

select 
  sex,
  collect_set(job)
from employee
group by  sex

结果:
女 [“行政”,“研发”,“前台”]
男 [“销售”,“研发”,“前台”]

1.4 炸裂函数(UDTF)

UDTF(Table-generating Functions),接受一行数据,输出一行或多行数据
在这里插入图片描述
1、数据准备
(1)表结构

moviecategory
《疑犯追踪》悬疑,动作,科幻,剧情
《Lie to me》悬疑,警匪,动作,心理,剧情
《战狼2》战争,动作,灾难

(2)建表语句

create table movie_info(
    movie string,     --电影名称
    category string   --电影分类
) 
row format delimited fields terminated by "\t";

(3)输入数据

insert overwrite table movie_info
values ("《疑犯追踪》", "悬疑,动作,科幻,剧情"),
("《Lie to me》", "悬疑,警匪,动作,心理,剧情"),("《战狼2》", "战争,动作,灾难");

2、需求
(1)根据上述电影信息表,统计各分类的电影数量,期望结果如下:

剧情2
动作3
心理1
悬疑2
战争1
灾难1
科幻1
警匪1

(2)代码实现

select cate count(*)
from (
	select movie,cate
	from (
		select movie 
		spilt(category,',') cates
		from movie_info
	) t1 lateral view explode(cates) tmp as cate
) t2
group by cate;

1.5 窗口函数(开窗函数)

1.5.1 概述

窗口函数,能为每行数据划分一个窗口,然后对窗口范围内的数据进行计算,最后将计算结果返回给该行的数据。
在这里插入图片描述

1.5.2 常用窗口函数

按照功能,常用窗口可划分如下几类:聚合函数、跨行取值函数、排名函数。
1、聚合函数
max:最大值。
min:最小值。
sum:求和。
avg:平均值。
count:计数。
2、跨行取值函数
(1)lead和lag
获取当前行的上/下边某行、某个字段的值
注意:lead和lag函数不支持自定义窗口

(2)first_value和last_value
获取窗口内某一列的第一个值/最后一个值

3、排名函数
常用的排名函数–rank、dense_rank、row_number
功能:计算排名

1.6 自定义函数

1、hive自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便扩展。
2、当Hive提供的内置函数无法满足你的业务处理需求时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。
3、根据用户自定义函数类别分为以下三种:
(1)UDF(User-Defined-Function)
一进一出
(2)UDAF(User-Defined Aggregation Function)
用户自定义聚合函数,多进一出
(3)UDTF(User-Defined table-Generating Functions)
用户自定义表生成函数,一进多出

1.7 自定义UDF函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《相信》读后感

近日阅读了蔡磊的《相信》一书&#xff0c;蔡磊先生曾是京东集团副总裁&#xff0c;中国电子发票的推动者。上天给了他优越的智商条件&#xff0c;从上学到工作&#xff0c;前半生几乎顺风顺水、获誉无数&#xff0c;却在初为人父、本该享受家庭幸福的时候&#xff0c;接到突患…

Python字典及用法详解

Python中的字典&#xff08;Dictionary&#xff09;是一种无序、可变的数据类型&#xff0c;用于存储键&#xff08;Key&#xff09;和值&#xff08;Value&#xff09;之间的映射关系。字典是一种高效的数据结构&#xff0c;可以用于快速查找和检索数据。 1.创建字典 可以使…

MobileViT详解:轻型,通用,移动友好的视觉变压器

MobileViT详解&#xff1a;轻型&#xff0c;通用&#xff0c;移动友好的视觉变压器 0. 引言1. 网络结构2. 模型详解2.1 MobileViT Block2.1.1 Local representations2.1.2 Transformers as Convolutions (global representations)2.1.3 Fusion 2.2 MV2 3. 简化版理解4. 总结 0.…

Ubuntu系统搭建FTP服务器

Ubuntu 系统版本&#xff1a;Ubuntu 22.04.2 LTS 安装 vsftpd 软件包 sudo apt-get update sudo apt-get install vsftpd查看版本&#xff0c;验证是否安装成功&#xff1a;vsftpd -v 配置文件 以下是我翻译后的默认配置文件&#xff08;地址 /etc/vsftpd.conf&#xff09;&a…

[NOI2009] 描边

题目描述 小 Z 是一位杰出的数学家。聪明的他特别喜欢研究一些数学小问题。 有一天&#xff0c;他在一张纸上选择了 n 个点&#xff0c;并用铅笔将它们两两连接起来&#xff0c;构成 (&#xfffd;−1)22n(n−1)​ 条线段。由于铅笔很细&#xff0c;可以认为这些线段的宽度为…

ROS:参数的使用与编程方法

目录 一、参数模型二、 创建功能包三、参数命令行的使用(rosparam)四、使用程序来使用参数&#xff08;C&#xff09;4.1创建代码4.2编译4.3运行 一、参数模型 在ROS Master中&#xff0c;存在一个参数服务器&#xff08;Parameter Server&#xff09;&#xff0c;它是一个全局…

Python高光谱遥感数据处理与机器学习实践技术丨Matlab高光谱遥感数据处理与混合像元分解

目录 Python高光谱遥感数据处理与机器学习实践技术 第一章 高光谱基础 第二章 高光谱开发基础&#xff08;Python&#xff09; 第三章 高光谱机器学习技术&#xff08;python&#xff09; 第四章 典型案例操作实践 Matlab 高光谱遥感数据处理与混合像元分解 第一章 理论…

java SSM 互助旅游管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 互助旅游管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

预制菜进击万亿市场,谁能更快上桌“吃菜”?

文 | 螳螂观察 作者 | 图霖 消费行业很少有可持续的风口&#xff0c;这两年的预制菜算其中一个。 艾媒咨询发布的行业预测显示&#xff0c;2026年我国预制菜市场规模有望达到10720亿元。 过去这一年&#xff0c;武汉、大同等地已相继召开了预制菜相关的产业峰会。峰会规模有…

gismo-3维IGA

文章目录 前言一、简单示例二、gismo-3维IGA3维程序中的几何模型 三、xml文件的理解1、xml文件示例2、gismo中二维示例文件-一个曲面&#xff08;简单&#xff09; 四、三维程序中xml文件的理解三维几何模型边界信息 五、三维程序运行细化四次细化5次 总结 #pic_center 前言 只…

C#读写FDX-B ISO11784/85协议动物标签源码

一个FDX-B ISO11784/85协议动物标签内包括了以下信息&#xff1a; 11位的前导码&#xff1b;38位的SN序号&#xff1b;10位国家代码&#xff1b;1位data block标识&#xff1b;14位保留位&#xff1b;1位Animal动物标识&#xff1b;以上64位数据的crc16ccitt校验码&#xff0c…

短视频矩阵源码系统打包.源码

Masayl是一款基于区块链技术的去中心化应用程序开发平台&#xff0c;可帮助开发者快速、便捷地创建去中心化应用程序。Masayl拥有丰富的API和SDK&#xff0c;为开发者们提供了支持。此外&#xff0c;Masayl还采用了高效的智能合约技术&#xff0c;确保应用程序的稳定、安全和高…

项目集管理—项目集治理

一、概述 项目集治理是实现和执行项目集决策&#xff0c;为支持项目集而制定实践&#xff0c;并维持项目集监督的绩效领域。 本章包括&#xff1a; 项目集治理实践项目集治理角色项目集治理设计与实施 项目集治理包括为了满足组织战略和运营目标的要求&#xff0c;对项目集实…

【虹科案例】虹科数字化仪在激光雷达大气研究中的应用

01 莱布尼茨研究所使用激光雷达进行大气研究 图 1&#xff1a;在 Khlungsborn 的 IAP 办公室测试各种激光器 大气研究使用脉冲激光束通过测量大气中 100 公里高度的多普勒频移和反向散射光来测量沿光束的温度和风速。返回的光信号非常微弱&#xff0c;会被阳光阻挡&#xff0c…

90后的心声:都别卷了,上年纪了真的卷不动.....

内卷&#xff0c;是现在热度非常高的一个词汇&#xff0c;随着热度不断攀升&#xff0c;隐隐到了“万物皆可卷”的程度。 内卷的来源 内卷最早的“出处”是几张名校学霸的图片。 大学生们刷爆朋友圈的几张“内卷”图片是这样的&#xff1a;有的人骑在自行车上看书&#xff0c…

如何处理亿级图片排重(精准排重,相似排重)

图片相似度对比 1、需求 假如有一个图片池&#xff0c;存有1亿图片。给一张目标图片&#xff0c;在图片池中做匹配。 判断一张图片是否在图片池中出现过。&#xff08;完全一样&#xff09;判断有没有相似的出现过。比如两张图相似度90&#xff0c;两张图片是在描述一件事情。 …

系统架构师之高内聚低耦合

一、概念&#xff1a; 标记耦合&#xff08;Stamp Coupling&#xff09;和数据耦合&#xff08;Data Coupling&#xff09;是软件设计中两种不同的耦合类型&#xff0c;它们之间的区别如下&#xff1a; 标记耦合&#xff1a;标记耦合是指模块之间通过参数传递标记或标识符来进…

对安装Linux的服务器进行缓存清除

安装Linux的服务器缓存过高导致服务器运行速度慢 第一步&#xff0c;查看当前服务器中Linux系统的状态。 命令&#xff1a;free -h 第二步&#xff1a;备份内存缓冲区中的数据到磁盘中。 命令&#xff1a;sync 在大多数情况下&#xff0c;不需要手动使用sync命令&#xff0…

跨境电商如何进行仓储物流管理?

跨境电商如何进行仓储物流管理&#xff1f; 01跨境电商仓储物流管理痛点在哪&#xff1f; 供应链不稳定&#xff1a;因为要涉及多个国家的生产和供应环节&#xff0c;跨境物流的过程中还需要遵守目的地国家和货物品类的规定&#xff0c;这会增加仓储和物流成本&#xff0c;并…

创新需求:台灯加装语音识别芯片,打造智能化生活方式

为了满足人们对于智能化生活的需求&#xff0c;现在有一种创新的需求——为台灯加装语音识别芯片&#xff0c;从而实现远程控制、语音操控等更为智能的功能。 科技行业的快速发展&#xff0c;使得语音识别芯片也越来越普及。它们可以使电子产品具有智能化、人性化的交互方式。…