掌握Hive函数[3]:从基础到高级应用

目录

窗口函数(开窗函数)

 概述

 常用窗口函数

1)聚合函数

2)跨行取值函数

(1)LEAD 和 LAG

(2)FIRST_VALUE 和 LAST_VALUE

3)排名函数

 案例演示

1. 数据准备

1)表结构

2)建表语句

3)装载语句

2. 需求

1)统计每个用户截至每次下单的累积下单总额

(1)期望结果

(2)需求实现

2)统计每个用户截至每次下单的当月累积下单总额

(1)期望结果

(2)需求实现

3)统计每个用户每次下单距离上次下单相隔的天数(首次下单按0天算)

(1)期望结果

(2)需求实现

4)查询所有下单记录以及每个用户的每个下单记录所在月份的首/末次下单日期

(1)期望结果

(2)需求实现

5)为每个用户的所有下单记录按照订单金额进行排名

(1)期望结果

(2)需求实现

 自定义函数

自定义UDF函数


窗口函数(开窗函数)

 概述

窗口函数是一种在SQL中处理数据的强大工具,它允许用户在结果集的一个特定窗口或范围内执行计算,而不是在整个查询结果上进行操作。

 常用窗口函数

按照功能,常用窗口函数可以划分为以下几类:聚合函数、跨行取值函数、排名函数。

1)聚合函数
  • MAX:最大值。
  • MIN:最小值。
  • SUM:求和。
  • AVG:平均值。
  • COUNT:计数。
2)跨行取值函数
(1)LEAD 和 LAG
  • LEAD:向前查看,即获取当前行之后的某一行的值。
  • LAG:向后查看,即获取当前行之前的一行的值。

 

(2)FIRST_VALUE 和 LAST_VALUE
  • FIRST_VALUE:返回窗口中第一个行的表达式的值。
  • LAST_VALUE:返回窗口中最后一个行的表达式的值。

 

3)排名函数
  • RANK:根据一个或多个列的值对行进行排序,并跳过中间的空位。
  • DENSE_RANK:与 RANK 类似,但是不会跳过任何排名。
  • ROW_NUMBER:给每一行分配一个唯一的整数。

 案例演示

1. 数据准备
1)表结构
order_iduser_iduser_nameorder_dateorder_amount
11001小元2022-01-0110
21002小海2022-01-0215
31001小元2022-02-0323
41002小海2022-01-0429
51001小元2022-01-0546
61001小元2022-04-0642
71002小海2022-01-0750
81001小元2022-01-0850
91003小辉2022-04-0862
101003小辉2022-04-0962
111004小猛2022-05-1012
121003小辉2022-04-1175
131004小猛2022-06-1280
141003小辉2022-04-1394
2)建表语句
CREATE TABLE order_info (order_id   STRING, --订单iduser_id    STRING, -- 用户iduser_name  STRING, -- 用户姓名order_date STRING, -- 下单日期order_amount INT    -- 订单金额
);
3)装载语句
INSERT OVERWRITE TABLE order_info
VALUES 
('1', '1001', '小元', '2022-01-01', '10'),
('2', '1002', '小海', '2022-01-02', '15'),
('3', '1001', '小元', '2022-02-03', '23'),
('4', '1002', '小海', '2022-01-04', '29'),
('5', '1001', '小元', '2022-01-05', '46'),
('6', '1001', '小元', '2022-04-06', '42'),
('7', '1002', '小海', '2022-01-07', '50'),
('8', '1001', '小元', '2022-01-08', '50'),
('9', '1003', '小辉', '2022-04-08', '62'),
('10', '1003', '小辉', '2022-04-09', '62'),
('11', '1004', '小猛', '2022-05-10', '12'),
('12', '1003', '小辉', '2022-04-11', '75'),
('13', '1004', '小猛', '2022-06-12', '80'),
('14', '1003', '小辉', '2022-04-13', '94');
2. 需求
1)统计每个用户截至每次下单的累积下单总额
(1)期望结果
order_iduser_iduser_nameorder_dateorder_amountsum_so_far
11001小元2022-01-011010
51001小元2022-01-054656
81001小元2022-01-0850106
31001小元2022-02-0323129
61001小元2022-04-0642171
21002小海2022-01-021515
41002小海2022-01-042944
71002小海2022-01-075094
91003小辉2022-04-086262
101003小辉2022-04-0962124
121003小辉2022-04-1175199
141003小辉2022-04-1394293
111004小猛2022-05-101212
131004小猛2022-06-128092
(2)需求实现
SELECTorder_id,user_id,user_name,order_date,order_amount,SUM(order_amount) OVER (PARTITION BY user_id ORDER BY order_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) sum_so_far
FROM order_info;
2)统计每个用户截至每次下单的当月累积下单总额
(1)期望结果
order_iduser_iduser_nameorder_dateorder_amountsum_so_far
11001小元2022-01-011010
51001小元2022-01-054656
81001小元2022-01-0850106
31001小元2022-02-032323
61001小元2022-04-064242
21002小海2022-01-021515
41002小海2022-01-042944
71002小海2022-01-075094
91003小辉2022-04-086262
101003小辉2022-04-0962124
121003小辉2022-04-1175199
141003小辉2022-04-1394293
111004小猛2022-05-101212
131004小猛2022-06-128080
(2)需求实现
SELECTorder_id,user_id,user_name,order_date,order_amount,SUM(order_amount) OVER (PARTITION BY user_id, SUBSTRING(order_date, 1, 7) ORDER BY order_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) sum_so_far
FROM order_info;
3)统计每个用户每次下单距离上次下单相隔的天数(首次下单按0天算)
(1)期望结果
order_iduser_iduser_nameorder_dateorder_amountdiff
11001小元2022-01-01100
51001小元2022-01-05464
81001小元2022-01-08503
31001小元2022-02-032326
61001小元2022-04-064262
21002小海2022-01-02150
41002小海2022-01-04292
71002小海2022-01-07503
91003小辉2022-04-08620
101003小辉2022-04-09621
121003小辉2022-04-11752
141003小辉2022-04-13942
111004小猛2022-05-10120
131004小猛2022-06-128033
(2)需求实现
SELECTorder_id,user_id,user_name,order_date,order_amount,NVL(DATEDIFF(order_date, last_order_date), 0) diff
FROM
(SELECTorder_id,user_id,user_name,order_date,order_amount,LAG(order_date, 1, NULL) OVER (PARTITION BY user_id ORDER BY order_date) last_order_dateFROM order_info
) t1;
4)查询所有下单记录以及每个用户的每个下单记录所在月份的首/末次下单日期
(1)期望结果
order_iduser_iduser_nameorder_dateorder_amountfirst_datelast_date
11001小元2022-01-01102022-01-012022-01-08
51001小元2022-01-05462022-01-012022-01-08
81001小元2022-01-08502022-01-012022-01-08
31001小元2022-02-03232022-02-032022-02-03
61001小元2022-04-06422022-04-062022-04-06
21002小海2022-01-02152022-01-022022-01-07
41002小海2022-01-04292022-01-022022-01-07
71002小海2022-01-07502022-01-022022-01-07
91003小辉2022-04-08622022-04-082022-04-13
101003小辉2022-04-09622022-04-082022-04-13
121003小辉2022-04-11752022-04-082022-04-13
141003小辉2022-04-13942022-04-082022-04-13
111004小猛2022-05-10122022-05-102022-05-10
131004小猛2022-06-12802022-06-122022-06-12
(2)需求实现
SELECTorder_id,user_id,user_name,order_date,order_amount,FIRST_VALUE(order_date) OVER (PARTITION BY user_id, SUBSTRING(order_date, 1, 7) ORDER BY order_date) first_date,LAST_VALUE(order_date) OVER (PARTITION BY user_id, SUBSTRING(order_date, 1, 7) ORDER BY order_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) last_date
FROM order_info;
5)为每个用户的所有下单记录按照订单金额进行排名
(1)期望结果
order_iduser_iduser_nameorder_dateorder_amountrkdrkrn
81001小元2022-01-0850111
51001小元2022-01-0546222
61001小元2022-04-0642333
31001小元2022-02-0323444
11001小元2022-01-0110555
71002小海2022-01-0750111
41002小海2022-01-0429222
21002小海2022-01-0215333
141003小辉2022-04-1394111
121003小辉2022-04-1175222
91003小辉2022-04-0862333
101003小辉2022-04-0962334
131004小猛2022-06-1280111
111004小猛2022-05-1012222
(2)需求实现
SELECTorder_id,user_id,user_name,order_date,order_amount,RANK() OVER (PARTITION BY user_id ORDER BY order_amount DESC) rk,DENSE_RANK() OVER (PARTITION BY user_id ORDER BY order_amount DESC) drk,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_amount DESC) rn
FROM order_info;

 自定义函数

1)Hive自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便地扩展。

2)当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。

3)根据用户自定义函数类别分为以下三种:

  • UDF(User-Defined-Function)
    • 一进一出。
  • UDAF(User-Defined Aggregation Function)
    • 用户自定义聚合函数,多进一出。
    • 类似于:count/max/min。
  • UDTF(User-Defined Table-Generating Functions)
    • 用户自定义表生成函数,一进多出。
    • 如 lateral view explode()。

4)官方文档地址

HivePlugins - Apache Hive - Apache Software Foundationicon-default.png?t=O83Ahttps://cwiki.apache.org/confluence/display/Hive/HivePlugins

5)编程步骤

  • (1)继承Hive提供的类
    • org.apache.hadoop.hive.ql.udf.generic.GenericUDF
    • org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
  • (2)实现类中的抽象方法
  • (3)在hive的命令行窗口创建函数
    • 添加jar。
      ADD JAR linux_jar_path;
    • 创建function。
      CREATE [TEMPORARY] FUNCTION [dbname.]function_name AS class_name;
  • (4)在hive的命令行窗口删除函数
    DROP [TEMPORARY] FUNCTION [IF EXISTS] [dbname.]function_name;

自定义UDF函数

0)需求

自定义一个UDF实现计算给定基本数据类型的长度,例如:

hive(default)> SELECT my_len("abcd");

输出结果应为4。

1)创建一个Maven工程Hive

2)导入依赖

<dependencies><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.3</version></dependency>
</dependencies>

3)创建一个类

package com.lzl.hive.udf;import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;/*** 我们需计算一个给定基本数据类型的长度*/
public class MyUDF extends GenericUDF {/*** 判断传进来的参数的类型和长度* 约定返回的数据类型*/@Overridepublic ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {if (arguments.length != 1) {throw new UDFArgumentLengthException("Please give me only one arg.");}if (!arguments[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)) {throw new UDFArgumentTypeException(1, "I need primitive type arg.");}return PrimitiveObjectInspectorFactory.javaIntObjectInspector;}/*** 解决具体逻辑的*/@Overridepublic Object evaluate(DeferredObject[] arguments) throws HiveException {Object o = arguments[0].get();if (o == null) {return 0;}return o.toString().length();}@Override// 用于获取解释的字符串public String getDisplayString(String[] children) {return "";}
}

4)创建临时函数

  • (1)打成jar包上传到服务器 /opt/module/hive/datas/myudf.jar
  • (2)将jar包添加到hive的classpath,临时生效
    hive (default)> ADD JAR /opt/module/hive/datas/myudf.jar;
  • (3)创建临时函数与开发好的java class关联
    hive (default)> 
    CREATE TEMPORARY FUNCTION my_len 
    AS "com.lzl.hive.udf.MyUDF";
  • (4)即可在HQL中使用自定义的临时函数
    hive (default)> 
    SELECT ename,my_len(ename) ename_len 
    FROM emp;
    • (5)删除临时函数
      hive (default)> DROP TEMPORARY FUNCTION my_len;
      注意:临时函数只跟会话有关系,跟库没有关系。只要创建临时函数的会话不断,在当前会话下,任意一个库都可以使用,其他会话全都不能使用。

5)创建永久函数

  • (1)创建永久函数 注意:因为ADD JAR本身也是临时生效,所以在创建永久函数的时候,需要指定路径(并且因为元数据的原因,这个路径还得是HDFS上的路径)。
    hive (default)> 
    CREATE FUNCTION my_len2 
    AS "com.lzl.hive.udf.MyUDF" 
    USING JAR "hdfs://hadoop12:8020/udf/myudf.jar";
  • (2)即可在HQL中使用自定义的永久函数
    hive (default)> 
    SELECT ename,my_len2(ename) ename_len 
    FROM emp;
  • (3)删除永久函数
    hive (default)> DROP FUNCTION my_len2;
    注意:永久函数跟会话没有关系,创建函数的会话断了以后,其他会话也可以使用。 永久函数创建的时候,在函数名之前需要自己加上库名,如果不指定库名的话,会默认把当前库的库名给加上。 永久函数使用的时候,需要在指定的库里面操作,或者在其他库里面使用的话加上 库名.函数名

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库锁之行级锁、记录锁、间隙锁和临键锁

1. 行级锁 InnoDB 引擎支持行级锁&#xff0c;而MyISAM 引擎不支持行级锁&#xff0c;只支持表级锁。行级锁是基于索引实现的。 对于普通的select语句&#xff0c;是不会加记录锁的&#xff0c;因为它属于快照读&#xff0c;通过在MVCC中的undo log版本链实现。如果要在查询时对…

spring security 中的授权使用

一、认证 身份认证&#xff0c;就是判断一个用户是否为合法用户的处理过程。Spring Security 中支持多种不同方式的认证&#xff0c;但是无论开发者使用那种方式认证&#xff0c;都不会影响授权功能使用。因为 SpringSecurity 很好做到了认证和授权解耦。 二、授权 授权&#x…

【Anaconda】修改jupyter notebook默认打开的工作目录、jupyter notebook快捷键

jupyter notebook快捷键 针对单元格的颜色蓝色命令行模式绿色编辑模式 两种模式的切换编辑模式切换到命令行模式 >>> esc键命令行模式切换到编辑模式 >>> 鼠标左键或者直接按enter键1.标题的书写方式1:1.esc进入命令行模式2.按m键3.写内容4.运行单元格即可方…

基于SpringBoot的智能制造云平台系统的设计与实现计算机毕设

一、选题背景与意义&#xff08;300字左右&#xff09; 根据工业4.0智能制造生态链中云工厂在实际生产当中的工作流程进行充分调研和整理出来的&#xff0c;描述最终用户在本系统中对于生产订单的处理、排产、以及生产的完整在线处理流程和业务需求的文档。 针对制造业而言&a…

COD论文笔记 BiRefNet

本质还是一个 U 型编码器解码器结构的分割模型。 我可以考虑将©和(d)结合&#xff0c;即对解码器的输入不进行 patchify,同时在各个阶段引入梯度参考信息 最近的相关工作&#xff0c;中间监督、额外先验(频率&#xff0c;梯度&#xff0c;边缘等)取得不错效果 作者观察到…

【数据分享】《中国城市统计年鉴》(1985-2023)全PDF版本 第一次补档

数据介绍 中国城市&#xff0c;如同一本生动的历史书&#xff0c;承载着经济、社会的快速变迁。《中国城市统计年鉴》记录了城市的发展轨迹&#xff0c;是我们理解城市化进程、洞察城市挑战的重要指南。 这份年鉴的数据庞大而详实&#xff0c;囊括了中国城市发展的多个方面。…

二、Maven工程的创建--JavaSEJavaEE

1、idea创建Maven JavaSE工程&#xff1a; 2、idea创建Maven JavaEE工程&#xff1a; &#xff08;1&#xff09;手动创建 &#xff08;2&#xff09;插件方式创建 在idea里安装插件JBLJavaToWeb&#xff1b; 选择需要生成的项目文件后&#xff0c;右击&#xff1a; 项目…

【verilog】1. 流水灯例程

文章目录 前言一、定义概念 缩写1. verilog 二、性质三、代码分解释四、完整代码参考文献 前言 数电课设 一、定义概念 缩写 1. verilog Verilog 是一种以代码形式来描述数字系统和电路的硬件描述语言 (HDL)。它由 Gateway Design Automation 在 20 世纪 80年代中期开发&a…

【Linux】进程控制(一)

1. 进程创建 &#xff08;一&#xff09;认识fork函数 从已存在进程中创建一个新进程&#xff08;新进程为子进程&#xff0c;而原进程为父进程&#xff09; 进程调用fork&#xff0c;当控制转移到内核中的fork代码后&#xff0c;内核做&#xff1a; 分配新的内存块和内核数…

JVM 调优篇1 类的加载器与加载过程

一 基本知识 1.1 JIT&AOT JIT: Just Time compilation 即时编译器 在程序运行时将字节码或中间表示转换为机器代码。 AOT: Ahead of Tmie Compilation &#xff1a; 预编译 在程序运行之前将高级语言代码完全编译成机器代码。 1.2 字面量和符号引用* 字面量&am…

逻辑代数的基本规则

目录 逻辑代数的基本规则 带入规则 反演规则 对偶规则 逻辑代数的基本规则 带入规则 将逻辑等式两边的某一变量均用同一个逻辑函数代替&#xff0c;等式仍然成立。 可以用A非代替A&#xff0c;也可以用C代替B。 也可使用BC这样一个整体代替B。 反演规则 可以把与换或&#x…

Mysql高级教程

1.安装部署 安装依赖性&#xff1a; [rootmysql-node10 ~]# dnf install cmake gcc-c openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el7_4.x86_64.rpm rpcgen.x86_64 下载并解压源码包 [rootmysql-node10 ~]# tar zxf mysql-boost-5.7.44.tar.gz [rootmysql-no…

Java项目——苍穹外卖(一)

Entity、DTO、VO Entity&#xff08;实体&#xff09; Entity 是表示数据库表的对象&#xff0c;通常对应数据库中的一行数据。它通常包含与数据库表对应的字段&#xff0c;并可能包含一些业务逻辑。 DTO&#xff08;数据传输对象&#xff09; 作用&#xff1a;DTO 是用于在…

AutosarMCAL开发——基于EB Gpt驱动

目录 1.Gpt原理2.EB配置以及接口应用2.1 EB配置2.2 接口应用 3.总结 1.Gpt原理 autosar GPT模块&#xff08;General Purpose Timer&#xff0c;通用定时器&#xff09;主要用于汽车ECU中的时间测量、计数和产生定时中断。它支持单次性和周期性定时器&#xff0c;可以在达到预…

Bitvise——进入服务器的快捷方式

第一步&#xff1a;在连接进服务器后&#xff0c;点击左侧的保存配置文件&#xff0c;保存至桌面。 第二步&#xff1a;将保存的配置文件&#xff08;后缀为 .tlp&#xff09;打开方式改为bitvise。 第三步&#xff1a;双击配置文件&#xff08;后缀为 .tlp&#xff09;&#…

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理&#xff0c;在有一定基础认识的前提下&#xff0c;通过阅读kubelet源码&#xff0c;对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管…

Android终端如何快速接入GB28181平台实现实时音视频回传

技术背景 GB28181是由中国国家标准委员会发布的基于IP网络的安防视频监控标准。Android平台GB28181设备对接模块&#xff0c;主要涉及到视频监控领域&#xff0c;可实现不具备国标音视频能力的 Android终端&#xff0c;通过平台注册接入到现有的GB/T28181—2016服务&#xff0…

Ifream实现微前端效果

记得有人曾问过我&#xff0c;老旧的项目内容很多&#xff0c;项目卡&#xff0c;想要改造成类似微前端&#xff0c;领导想要快速&#xff0c;又不想系统重构、而且是不同子系统的协同&#xff0c;要怎么做&#xff1f;对方不想做太大的改造&#xff0c;所以想用ifream的方式动…

如何打造高效办公楼物业管理系统?Java SpringBoot+Vue架构详解,实现智能化管理,提升工作效率

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片那是获取资料的入口&#xff01; 【全网最全】2024年数学建模国赛A题30页完整建模文档17页成品论文保奖matla代码可视化图表等&#xff08;后续会更新&#xff09;「首先来看看目前已有的资料&#xff0…