Hive——Hive常用内置函数总结

news2025/7/23 21:12:38

✅作者简介:最近接触到大数据方向的程序员,刚入行的小白一枚
🍊作者博客主页:皮皮皮皮皮皮皮卡乒的博客
🍋当前专栏:Hive学习进阶之旅
🍒研究方向:大数据方向,数据汇聚,数据治理
🍎上一篇博文:Hive——详细总结Hive中各大查询语法

文章目录

  • 1. 基础函数
    • 1.1 NVL函数
    • 1.2 CASE WHEN THEN ELSE END函数
    • 1.3 行转列CONCAT[列合并]
    • 1.4 列转行EXPLODE(炸裂函数)
  • 2. 开窗函数OVER()
    • 2.1 开窗函数介绍
    • 2.2 开创函数实际应用
    • 2.3 开窗函数官方文档
  • 3. Rank函数,以及函数分类
    • 3.1 RANK函数
    • 3.2 RANK()函数使用
    • 3.3 函数类别

1. 基础函数

1.1 NVL函数

  • 函数说明
    • NVL:给值为 NULL 的数据赋值,它的格式是 NVL( value ,default_value)。
  • 函数功能
    • 如果 value 为 NUL则 NVL ,函数返回 default_value 的值,否则返回 value 的值,如果两个参数 都为 NULL ,则返回 NULL。

使用样例:
    下列场景说明:有两个表,员工表和部门表,有这样不规则一组数据,虽有有这个部门但是部门没有员工,所以再求满外连接的时候,需要使用NVL函数

select 
e.empno,
e.ename,
nvl(e.deptno,d.deptno),
d.dname
from emp e
full join dept d
on e.deptno = d.deptno;

1.2 CASE WHEN THEN ELSE END函数

  • 函数说明
    • 这组函数类似于C语言中的case语句,case 变量 when ‘变量值1’ then ‘表达式1’ when ‘变量值2’ then ‘表达式2’ else ‘表达式3’ end 【中间还可以继续嵌入when then】
  • 函数功能
    • 用于处理有判断字段值需求的查询语句,例如:在同时求不同部门男生以及女生总数的查询时,显示不能简单地使用SUM函数+GROUP BY 子句进行查询,因为有两个分组需求,一个是部门,一个是性别,所以需要借助CASE WHEN函数,在GROUP 分组之后,在SUM函数内部做出性别分组

上述样例实现

select                                                                    		
dept_id,                                                                			
sum(case sex when '男 ' then 1 else 0 end) male_count,                   	
sum(case sex when '女 ' then 1 else 0 end) female_count                  	
from emp_sex                                                              
group by dept_id;

1.3 行转列CONCAT[列合并]

函数简介
在这里插入图片描述

说明:
COLLECT_SET(),会将传入的数值进行去重处理
COLLECT_LIST(),不会将传入的数值进行去重处理

函数测试:

在这里插入图片描述

创建表以及加载数据

create table person_info(                                                 
name string,
constellation string,
blood_type string)                                                        
row format delimited fields terminated by "\t";                          
	
load data local inpath "/opt/module/hive/data/person_info.txt"
 into table person_info;                              

查询语句:

select
con_blo,concat_ws('|',collect_set(name))
from 
(select 
concat(constellation,',',blood_type) con_blo,name
from person_info)t1
group by con_blo);

1.4 列转行EXPLODE(炸裂函数)

在这里插入图片描述

  • EXPLODE函数:
    • 功能:可以将一个具有多个数据地字段拆开,变成多行显示
  • LATERAL_VIEW函数
    • 功能:可以将炸裂出来的字段跟原表的字段保留出来原有的关联

函数使用:
在这里插入图片描述
创建表、加载数据以及实现查询

 create table movie_info(                                                  	
movie string, category string)                                                     
row format delimited fields terminated by "\t";                          
	
load data local inpath "/opt/module/data/movie.txt" 
into table movie_info;

select movie ,category_name from movie_info
LATERAL VIEW explode(split(category,",")) cate_gory_tmp AS category_name;

2. 开窗函数OVER()

2.1 开窗函数介绍

    深入理解何为开窗?

    开窗,可以理解为窗口的大小,这个窗口是对当前查询情景而言的,例如:在一个用户的年度商品购买记录表中,需要计算6月份花销总额,那么窗口的大小就是6月1号到6月30号,如果求第二季度的花销,那么窗口就从4月1号到6月30号

在这里插入图片描述

2.2 开创函数实际应用

数据准备
第一列为用户名,第二列为用户购买商品时间,第三列为购买金额

jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46 
jack,2017-04-06,42 
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94

需求
(1) 查询在 2017 年 4 月份购买过的顾客及总人数
窗口大小:所有被’2017-04’过滤出来的数据

select
name,
count(*) over()
from business
where substring(orderdate,0,7) = '2017-04'
group by name;

(2)查询顾客的购买明细及购买总额
窗口大小:限制为相同的姓名

select
	name,
	orderdate,
	cost,
	sum(cost) over(partition by name) per_cost_sum
from
business;

(3)查询顾客的购买明细以及每一个顾客每一个月购买总额
窗口大小:每一个顾客的每一个月,因此尽量两个分区

select
	name,
	orderdate,
	cost,
	sum(cost) over(partition by name ,month(orderdate)) per_cost_sum
from
business;

(4) 将每个顾客的 cost 按照日期进行累加
窗口大小:每一个顾客,规则:按照日期对用户的购买记录排序

select 
name,
orderdate,
cost,
sum(cost) over(partition by name order by orderdate)
from business;

注意:使用order by 默认在后面进行行限制rows bewtween UNBOUNDED PRECEDING and CURRENT ROW


以下为测试
CURRENT ROW:当前行
n PRECEDING:往前 n 行数据
n FOLLOWING:往后 n 行数据
UNBOUNDED :起点,
UNBOUNDED PRECEDING 表示从前面的起点,
UNBOUNDED FOLLOWING 表示到后面的终点

  • 随便玩,只需要修改BETWEEN AND里面的范围即可

Ⅰ:将每个顾客的 cost 加上当前行,前一行和后一行进行累加

select 
name,
orderdate,
cost,sum(cost) over(partition by name order by orderdate
rows between 1 preceding and 1 following)  
from business;

Ⅱ:将每个顾客的 cost 加上没有边界的地方开始加,加到前一行

select 
name,
orderdate,
cost,
sum(cost) over(partition by name order by orderdate
rows between unbounded preceding and 1 preceded)  
from business;

Ⅲ:将每个顾客的 cost 加上当前行到最后一行进行累加

select 
name,
orderdate,
cost,sum(cost) over(partition by name order by orderdate
rows between current row and unbounded following)  
from business;

LAG()函数测试

lag(参数名称,向前几行,如果为null,显示的值)

测试:显示每一个用户的上一次购买商品的时间

select
name,orderdate,
lag(orderdate,1,orderdate)over(group by name order by orderdate)
from business;
  • 实际应用场景:
    • 求用户页面的转发率,A->B A->C B->C,

ntile()
查询前 20%时间的订单信息

select
name,orderdate,cost,sorted
from 
(select name,orderdate,cost,
ntile(5) over(order by orderdate) sorted
from business)t1
where sorted =1;

2.3 开窗函数官方文档

在这里插入图片描述
【下图描述比较重要】
在这里插入图片描述

3. Rank函数,以及函数分类

3.1 RANK函数

RANK()函数在使用时,因为他有窗口的限制,也需要结合OVER来使用。

  • 在进行排序时,通常会伴随着排名,而且可能是多种类型的排名,场景:公司排名–》部门排名—》小组排名,因此也需要设置窗口

在这里插入图片描述

3.2 RANK()函数使用

数据准备:在这里插入图片描述

创建表以及加载数据

create table score(                                                       
name string,                                                              
subject string,                                                           	
score int)                                                                
row format delimited fields terminated by "\t";                          
load data local inpath '/opt/module/data/score.txt' into table score;    

Ⅰ:根据学科进行排名

select *,rank()over(partition by subject order by score)
from score;

Ⅱ:取每一个学科前三名

select 
name,subject,score,rank_id
from 
(select *,rank()over(partition by subject order by score desc) rank_id
from score)t1
where rank_id <=3;

3.3 函数类别

函数分三类:

在这里插入图片描述

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

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

相关文章

vdsm:添加接口调试demo

目录 添加API接口 2.添加api方法 3.Vdsm-api.yml添加参数 暴露jsonrpc接口&#xff1a; 需要重启vdsmd vdsm-client 调试 本文通过添加一个配置ovs全局参数的接口 添加API接口 文件路径&#xff1a;API.py 2.添加api方法 文件路径&#xff1a;network/api.py 3.Vdsm-ap…

4.2——Node.js的npm和包

目录初识node.jsnode.js的安装和查看版本使用node命令对js文件运行窗口的快捷键fs 文件系统模块fs.readFile() 方法写入文件fs.writeFile()案例——考试成绩整理路径问题path 路径模块路径拼接path.join()获取路径中的文件名path.basename()获取路径中的文件扩展名path.extname…

用Python的Django框架来制作一个RSS阅读器

Django带来了一个高级的聚合生成框架&#xff0c;它使得创建RSS和Atom feeds变得非常容易。 什么是RSS&#xff1f; 什么是Atom&#xff1f; RSS和Atom都是基于XML的格式&#xff0c;你可以用它来提供有关你站点内容的自动更新的feed。 了解更多关于RSS的可以访问 http://www…

[附源码]SSM计算机毕业设计足球队管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]java毕业设计企业记账系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

QT 发布文章遇到问题解决方案

提供了两种可以发布 Qt 程序的方案&#xff0c;建议使用第二种直接生成对应的文件&#xff0c;直接打包就可以 1. 手动复制需要的文件到运行目录下 我们写完 QT 程序当然是要发布或者发给其他需要用到的人&#xff0c;由于找不到Qt6Core.dll,无法继续执行代码,打开 realease …

Python基础语法

一、字面量&#xff1a;在代码中&#xff0c;被写下来的固定的值 二、注释 /增加代码的可读性 单行注释 #空格注释文字内容 &#xff08;加空格只是规范&#xff09;#右边 多行注释 一对三个双引号 """注释内容""" 三、变量 -->程序运行时…

Linux基础内容(12)—— 程序地址空间

目录 1.误区和它的由来 2.虚拟地址的证明 3.虚拟地址的实现 1.虚拟空间的解释 2.操作系统管理和规划虚拟空间 3.虚拟地址与物理地址的联系 4.多进程的虚拟地址解释 5.磁盘中可执行文件的地址 6.进程地址空间出现的原因 接上面内容 Linux基础内容&#xff08;11&#…

在排序数组中查找元素的第一个和最后一个位置 - 力扣中等

在排序数组中查找元素的第一个和最后一个位置 题目链接 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间…

2022 年 10 月 NFT 报告

Sept. 13, 2022, Daniel Data Source: October 2022 NFT Report (ENG) 10 月对于区块链来说是一个相对沉闷的月份&#xff0c;没有巨大的市场波动、项目启动或融资轮次。 由于宏观环境依然严峻&#xff0c;NFT 市场自夏末以来继续停滞不前。 从上个月的报告开始&#xff0c;F…

精准配置无线接入点发射功率

目录 1、为什么需要调节无线接入点的发射功率 2、无线接入点发送功率配置原则 2.1 802.11管理帧发射功率对接入行为影响 2.2 802.11数据帧发射功率对接入质量的影响 2.3 802.11管理帧、数据帧发射功率协调原则 1、数据帧发射功率务必大于等于管理帧发射功率 2、高频射频…

DOX-Poloxamer/DBCO-PEG-DOX 阿霉素修饰泊洛沙姆/二苯基环辛-聚乙二醇-阿霉素的探究

小编这里分享了DOX-Poloxamer/DBCO-PEG-DOX 阿霉素修饰泊洛沙姆/二苯基环辛-聚乙二醇-阿霉素的探究&#xff0c;和小编一起来看&#xff01; DBCO&#xff08;二苯并环辛炔&#xff09;是一种环炔烃&#xff0c;可以通过在水溶液中通过应变促进的1,3-偶极环加成反应与叠氮化物反…

【毕业设计】机器视觉答题卡识别系统 - python 深度学习

文章目录1 简介2 什么是机器视觉3 实现步骤4 最后1 简介 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学校对毕设的要求越来越高&#xff0c;难度也…

Cy7-NH2/amine氨基修饰荧光染料

伯胺基(primary amine)是生物标记反应中常用的基团。蛋白表面赖氨酸侧链(residue)官能团就是伯氨基,伯胺基可以和NHS活化酯(N-羟基琥珀酰亚胺酯,N-hydroxysuccinimide ester,succinimidyl ester),异氰酸酯(-NCS,isothiocyanate)或其它活化基团反应生成稳定链接,从而把Cy7分子连…

标志寄存器

标志寄存器 文章目录标志寄存器1.标志寄存器概念1.1 零标志位(ZF)1.2 奇偶标志位(PF)1.3 符号标志符(SF)1.4 进位标志符(CF)1.5溢出标志符(OF)2.adc指令和sbb指令3.cmp指令4.检测比较结果的条件转移指令5.DF标志和串传送指令6.pushf和popf1.标志寄存器概念 CPU内部的寄存器中&a…

UG NX 12装配——组件位置:装配约束

利用装配约束在装配中定位组件。 选择【装配】【组件】【装配约束】命令&#xff0c;或单击【装配】工具条上的【装配约束】按钮出现【装配约束】对话框。 &#xff08;1&#xff09;接触对齐 接触对齐约束可约束两个组件&#xff0c;使其彼此接触或对齐。这是最常用的约束。…

m无线通信信道matlab仿真,包括自由空间损耗模型,Okumura-Hata模型,COST231 Hata模型,SUI信道模型

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 无线信道是移动通信的传输媒体&#xff0c;所有的信息都在这个信道中传输。信道性能的好坏直接决定着人们通信的质量&#xff0c;因此要想在有限的频谱资源上尽可能地高质量、大容量传输…

2022关键之年,国产奶粉「争霸之秋」

奶粉又到关键年。 在中国奶粉的发展历程中&#xff0c;有两个关键性的时间节点&#xff1a;2008年&#xff0c;三鹿事件打乱了国产奶粉的发展节奏&#xff0c;洋奶粉开始大行其道&#xff1b;2016年&#xff0c;婴配粉注册制实行&#xff0c;打着“更适合中国宝宝体质”旗号的…

数据库系统工程师难考吗?

数据库系统工程师属于软考中级科目&#xff0c;只要你多看书多做练习&#xff0c;熟悉考试题型&#xff0c;用对学习方法&#xff0c;并不难考的。但是你专业不对口&#xff0c;应该在备考上多下功夫&#xff0c;建议把考试大纲里的内容复习一遍&#xff0c;掌握好考纲里的知识…

使用android 提取小米手机日志

如何使用android sdk获取小米日志 下载android sdk 登录网址https://www.androiddevtools.cn/ 往下滑找到SDK tools,下载zip包并解压到电脑随便一个位置 解压缩位置打开SDK Manager.exe&#xff0c;安装相关工具&#xff08;具体可以网络搜索&#xff09; 打开电脑cmd 使用a…