Hive【Hive(六)窗口函数】

news/2024/12/23 7:45:10/

窗口函数(window functions)

概述

定义

        窗口函数能够为每行数据划分 一个窗口,然后对窗口范围内的数据进行计算,最后将计算结果返回给该行数据。

语法

        窗口函数的语法主要包括 窗口函数 两个部分。其中窗口用于定义计算范围,函数用于定义计算逻辑。

select order_id,order_date,amount,函数(amount) over (窗口范围) 别名
from order_info;

函数

        绝大多数的聚合函数都可以配合窗口函数使用,例如 max、min、sum、count、avg、以及前面学到的 collect_list、collect_set 等。

窗口

        窗口范围的定义分为两种,一种是基于的,一种是基于的。

基于行

sum(amount) over(order by 排序字段 rows between 起点 and 终点) 别名

如果起点是下面两种:

  1. unbounded preceding       第一行
  2. [num] preceding               当前行的前 num 行

则终点可以是:

  1. [num] preceding              当前行的前 num 行
  2. current row                      当前行
  3. [num] following                当前行的后 num 行
  4. unbounded following       最后一行

如果起点是:

  • current row

那么终点可以是:

  1. current row                      当前行
  2. [num] following                当前行的后 num 行
  3. unbounded following       最后一行

如果起点是:

  • [num] following

则终点可以是:

  1. [num] following                当前行的后 num 行
  2. unbounded following       最后一行

注意:

        真正进行窗口函数计算的时候,必须选定一个排序的字段(order by),因为每个窗口函数的作用范围会由于 MapReduce 切片、Shuffle 这些因素而不确定(上一行和下一行可能在不同的切片中)。

案例

 实际意义:截止当前订单的销售总额。

基于值

sum(amount) over (order by 划分窗口范围的字段 range between 起点 and 终点) 别名

除了 over 关键字换成了 range ,别的没有变化。

        注意:这里的 order by 并不是指的排序字段,基于值的窗口函数并不会排序,这里的 order  by 指的是基于哪个字段在值进行窗口范围的划分。 order by 的字段可以是数值型(比如计算指定窗口范围值 num 的就必须是数值型)也可以是别的类型(这时 order by 的字段不可以通过 num 指定窗口范围 )。

        同样,基于列的窗口函数中,[num] preceding 和 [num] following 中的 num 指的是当前值 -num 和 +num。

案例

实际意义:截止当前日期的销售总额。

分区

定义窗口范围时,可以指定分区字段,每个分区单独划分一个窗口。

sum(amount) over (partition by 划分窗口范围的字段 rows between 起点 and 终点) 别名
案例

实际意义:每个用户截止到最后下单的累计下单金额。

缺省

        over() 中的三部分内容 partition by、order by 、(rows |range) between ... and ... 均可省略不写。

partition by 省略不写,代表不分区。

order by 省略不写:

  1. 如果是基于 row 的,则 order by 必须写,除非窗口范围是第一行到最后一行(rows between unbounded preceding and unbounded following)。
  2. 如果是基于 range ,order by 同样必须写。因为如果不写,就相当于没有声明根据哪个字段的值来声明窗口的范围,同样无效,此时,窗口范围是 (负无穷,正无穷)。

(rows |range) between ... and ...省略不写:

  1. 如果over()中包含 order by:则默认值为 range between unbounded preceding and current row
  2. 如果over()中不包含 order by:则默认值为 rows between unbounded preceding and unbounded following

常用窗口函数


http://www.ppmy.cn/news/1136616.html

相关文章

大模型部署手记(4)MOSS+Jetson AGX Orin

1.简介 组织机构:复旦大学 代码仓:GitHub - OpenLMLab/MOSS: An open-source tool-augmented conversational language model from Fudan University 模型:fnlp/moss-moon-003-sft-int4 下载:https://huggingface.co/fnlp/mos…

Java中的instanceof

Java中的instanceof运算符是一种非常有用的工具,它可以帮助我们在运行时动态地确定对象的类型。通过使用instanceof,我们可以轻松地检查一个对象是否是指定类型(或其子类)的实例。本文将详细介绍instanceof运算符的使用方法、特点…

commons-collections4工具常用方法

commons-collections4是Apache Commons项目中的一个模块&#xff0c;提供了一系列处理集合和映射的工具类、接口和算法。它是在commons-collections的基础上进行了改进和增强&#xff0c;为Java开发者提供了更多集合操作的功能和便利性。 引入依赖 <dependency><group…

哈希表(Hash Table)介绍

哈希表&#xff08;Hash Table&#xff09;介绍 哈希表&#xff08;Hash Table&#xff09;&#xff1a;也叫做散列表。是根据键值&#xff08;Key Value、关键码值&#xff09;直接进行访问的数据结构。 哈希表通过“键&#xff08;key&#xff09;”和“映射函数&#xff0…

城市智慧公厕:提升城市卫生品质与智能化管理的新基建焦点

在现代化城市建设中&#xff0c;城市环卫是一个不可忽视的重要环节。而在城市环卫中&#xff0c;公厕作为保障市民生活质量的一项基础设施&#xff0c;也越来越受到各级政府的关注。然而&#xff0c;传统的公厕管理模式往往存在着诸多问题&#xff0c;如卫生状况难以保证、管理…

8、SpringBoot_多环境开发

二、多环境开发 1.概述 概述&#xff1a;开发环境、测试环境、生产环境 分类 开发环境 spring:datasource:druid:url: jdbc:mysql://localhost:3306/springboot_ssmusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver测试环境 spring:datasource:dr…

C++【4】指针与引用;数组指针;指针数组

/* 指针变量作为函数参数 函数的参数可以是指针类型&#xff0c;它的作用是将一个变量的地址传送到另一个函数中。 指针变量作为函数参数与变量本身作为函数参数不同&#xff0c;变量作函数参数传递的是具体值。 而指针作为函数参数传递的是内存的…

Redis高可用之哨兵模式、集群

文章目录 一、Redis哨兵模式1.1 简介1.2 哨兵模式的作用1.3 哨兵结构1.4 故障转移机制&#xff08;重要&#xff09;1.5 主节点选举机制 二、部署Redis哨兵模式Step1 修改 Redis 哨兵模式的配置文件&#xff08;所有节点操作&#xff09;Step2 实现基于VIP&#xff08;虚拟IP&a…