Hive(12):Hive分析函数-窗口函数(Windowing)

2024-05-24 11:32

本文主要是介绍Hive(12):Hive分析函数-窗口函数(Windowing),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、实现功能

对于分组之后的数据进行处理。

官网:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics

二、加载数据

1.emp.txt和dept.txt数据

(1)emp.txt

7369    SMITH   CLERK   7902    1980-12-17      800.00          20
7499    ALLEN   SALESMAN        7698    1981-2-20       1600.00 300.00  30
7521    WARD    SALESMAN        7698    1981-2-22       1250.00 500.00  30
7566    JONES   MANAGER 7839    1981-4-2        2975.00         20
7654    MARTIN  SALESMAN        7698    1981-9-28       1250.00 1400.00 30
7698    BLAKE   MANAGER 7839    1981-5-1        2850.00         30
7782    CLARK   MANAGER 7839    1981-6-9        2450.00         10
7788    SCOTT   ANALYST 7566    1987-4-19       3000.00         20
7839    KING    PRESIDENT               1981-11-17      5000.00         10
7844    TURNER  SALESMAN        7698    1981-9-8        1500.00 0.00    30
7876    ADAMS   CLERK   7788    1987-5-23       1100.00         20
7900    JAMES   CLERK   7698    1981-12-3       950.00          30
7902    FORD    ANALYST 7566    1981-12-3       3000.00         20
7934    MILLER  CLERK   7782    1982-1-23       1300.00         10

(2)dept.txt

10      ACCOUNTING      NEW YORK
20      RESEARCH        DALLAS
30      SALES   CHICAGO
40      OPERATIONS      BOSTON

2.创建分析表并且加载数据

(1)emp人员表

create EXTERNAL table emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
row format delimited fields terminated by '\t' ;
load data local inpath '/opt/datas/emp.txt' into table emp;

(2)dept部门表

create EXTERNAL table dept(
deptno int,
dname string,
loc string
)
row format delimited fields terminated by '\t' ;
load data local inpath '/opt/datas/dept.txt' into table dept;

 

三、分析实例

1.测试表

hive (hadoop)> select * from emp;
OK
emp.empno       emp.ename       emp.job emp.mgr emp.hiredate    emp.sal emp.comm        emp.deptno
7369    SMITH   CLERK   7902    1980-12-17      800.0   NULL    20
7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30
7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30
7566    JONES   MANAGER 7839    1981-4-2        2975.0  NULL    20
7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30
7698    BLAKE   MANAGER 7839    1981-5-1        2850.0  NULL    30
7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10
7788    SCOTT   ANALYST 7566    1987-4-19       3000.0  NULL    20
7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10
7844    TURNER  SALESMAN        7698    1981-9-8        1500.0  0.0     30
7876    ADAMS   CLERK   7788    1987-5-23       1100.0  NULL    20
7900    JAMES   CLERK   7698    1981-12-3       950.0   NULL    30
7902    FORD    ANALYST 7566    1981-12-3       3000.0  NULL    20
7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10
Time taken: 0.247 seconds, Fetched: 14 row(s)

2.实例

(1)查询部门编号10的所有员工的信息,按照薪资进行降序排列

select * from emp where deptno='10' order by sal desc;
结果:
emp.empno       emp.ename       emp.job emp.mgr emp.hiredate    emp.sal emp.comm        emp.deptno
7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10
7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10
7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10

(2)窗口:查询所有部门的员工的信息,按照薪资进行降序排列,多加一个字段:显示该部门的最高薪资, 或者显示该部门的最低薪资。备注:求最大值,要desc;求最小值,要asc。否则会出错!

  求最大值

hive (hadoop)> select empno,ename,deptno,sal,max(sal) over (partition by deptno order by sal desc) as max_sal from emp;
结果:
empno   ename   deptno  sal     max_sal	
7839    KING    10      5000.0  5000.0	
7782    CLARK   10      2450.0  5000.0	
7934    MILLER  10      1300.0  5000.0	7788    SCOTT   20      3000.0  3000.0	
7902    FORD    20      3000.0  3000.0	
7566    JONES   20      2975.0  3000.0	
7876    ADAMS   20      1100.0  3000.0	
7369    SMITH   20      800.0   3000.0	7698    BLAKE   30      2850.0  2850.0	
7499    ALLEN   30      1600.0  2850.0
7844    TURNER  30      1500.0  2850.0
7654    MARTIN  30      1250.0  2850.0
7521    WARD    30      1250.0  2850.0
7900    JAMES   30      950.0   2850.0

  求最小值

hive (hadoop)> select empno,ename,deptno,sal,min(sal) over (partition by deptno order by sal asc) as min_sal from emp;
结果:
empno   ename   deptno  sal     min_sal
7934    MILLER  10      1300.0  1300.0
7782    CLARK   10      2450.0  1300.0
7839    KING    10      5000.0  1300.0
7369    SMITH   20      800.0   800.0
7876    ADAMS   20      1100.0  800.0
7566    JONES   20      2975.0  800.0
7788    SCOTT   20      3000.0  800.0
7902    FORD    20      3000.0  800.0
7900    JAMES   30      950.0   950.0
7654    MARTIN  30      1250.0  950.0
7521    WARD    30      1250.0  950.0
7844    TURNER  30      1500.0  950.0
7499    ALLEN   30      1600.0  950.0
7698    BLAKE   30      2850.0  950.0

(3)分析函数row_number:查询所有部门的员工的信息,按照薪资进行降序排列,最后一列显示编号

hive (hadoop)> select empno,ename,deptno,sal,row_number() over (partition by deptno order by sal desc) as rn from emp;
结果:
empno   ename   deptno  sal     rn
7839    KING    10      5000.0  1
7782    CLARK   10      2450.0  2
7934    MILLER  10      1300.0  37788    SCOTT   20      3000.0  1
7902    FORD    20      3000.0  2
7566    JONES   20      2975.0  3
7876    ADAMS   20      1100.0  4
7369    SMITH   20      800.0   57698    BLAKE   30      2850.0  1
7499    ALLEN   30      1600.0  2
7844    TURNER  30      1500.0  3
7654    MARTIN  30      1250.0  4
7521    WARD    30      1250.0  5
7900    JAMES   30      950.0   6

(4)去重薪水一样的(总共有14个人,有4个人两两薪水是一样的,hql结果应该是12人)

hive (hadoop)> select deptno,count(DISTINCT sal) over (partition by deptno ) as countNum from emp group by deptno;
结果:
deptno  countnum
10      3
20      4
30      5

(5)统计每个部门的人数

hive (hadoop)> select deptno,count(*) as count from emp group by deptno;
结果:
deptno  count
10      3
20      5
30      6

或者使用窗口函数

hive (hadoop)> select deptno,count(empno) over (partition by deptno) as count from emp group by deptno,empno;
结果:
deptno  count
10      3
10      3
10      3
20      5
20      5
20      5
20      5
20      5
30      6
30      6
30      6
30      6
30      6
30      6

(6)windows范围

PRECEDING:往前
FOLLOWING:往后
CURRENT ROW:当前行
UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING:表示到后面的终点

//1.分组内所有行排序
hive (hadoop)>  select empno,ename,deptno,sal,row_number() over (partition by deptno order by sal desc) as rn from emp;//2.分组内当前行+往前1行:加和
hive (hadoop)>  select empno,ename,deptno,sal,row_number() over (partition by deptno order by sal desc) as rn,
sum(sal) over (partition by deptno order by sal desc ) s1,
sum(sal) over (partition by deptno order by sal desc rows between 1 PRECEDING and CURRENT ROW) s2
from emp;结果:s2是本行和上一行的加和
empno   ename   deptno  sal     rn      s1      s2
7839    KING    10      5000.0  1       5000.0  5000.0
7782    CLARK   10      2450.0  2       7450.0  7450.0
7934    MILLER  10      1300.0  3       8750.0  3750.0
7788    SCOTT   20      3000.0  1       6000.0  3000.0
7902    FORD    20      3000.0  2       6000.0  6000.0
7566    JONES   20      2975.0  3       8975.0  5975.0
7876    ADAMS   20      1100.0  4       10075.0 4075.0
7369    SMITH   20      800.0   5       10875.0 1900.0
7698    BLAKE   30      2850.0  1       2850.0  2850.0
7499    ALLEN   30      1600.0  2       4450.0  4450.0
7844    TURNER  30      1500.0  3       5950.0  3100.0
7654    MARTIN  30      1250.0  4       8450.0  2750.0
7521    WARD    30      1250.0  5       8450.0  2500.0
7900    JAMES   30      950.0   6       9400.0  2200.0
Time taken: 23.458 seconds, Fetched: 14 row(s)//3.分组内当前行+往后所有行:加和
hive (hadoop)>  select empno,ename,deptno,sal,row_number() over (partition by deptno order by sal desc) as rn,
sum(sal) over (partition by deptno order by sal desc ) s1,
sum(sal) over (partition by deptno order by sal desc rows between CURRENT ROW and unbounded following ) s2
from emp;
结果:s2即为本行到最后一行累加结果(当然,是在窗口内)empno   ename   deptno  sal     rn      s1      s2
7839    KING    10      5000.0  1       5000.0  8750.0
7782    CLARK   10      2450.0  2       7450.0  3750.0
7934    MILLER  10      1300.0  3       8750.0  1300.0
7788    SCOTT   20      3000.0  1       6000.0  10875.0
7902    FORD    20      3000.0  2       6000.0  7875.0
7566    JONES   20      2975.0  3       8975.0  4875.0
7876    ADAMS   20      1100.0  4       10075.0 1900.0
7369    SMITH   20      800.0   5       10875.0 800.0
7698    BLAKE   30      2850.0  1       2850.0  9400.0
7499    ALLEN   30      1600.0  2       4450.0  6550.0
7844    TURNER  30      1500.0  3       5950.0  4950.0
7654    MARTIN  30      1250.0  4       8450.0  3450.0
7521    WARD    30      1250.0  5       8450.0  2200.0
7900    JAMES   30      950.0   6       9400.0  950.0
Time taken: 22.953 seconds, Fetched: 14 row(s)

3.总结

窗口函数核心特征:不减少原始数据个数,只是开辟一个新的维度去观察当前数据。

四、参考

1.hive窗口函数必备宝典

https://blog.csdn.net/dingchangxiu11/article/details/83145151

这篇关于Hive(12):Hive分析函数-窗口函数(Windowing)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/998288

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高