分享好友 最新动态首页 最新动态分类 切换频道
Hive中的炸裂、窗口函数及示例
2024-12-26 23:00

针对一行数据,输出多行数据,主要用于map,array这种的

Hive中的炸裂、窗口函数及示例

根据一个例子来看

  • friends 是一个array数组
  • students 是一个map
  • address是一个struct

explode函数以array类型数据输入,然后对数组中的数据进行迭代,返回多行结果,一行一个数组元素值。

作用于array

  • arrayCol :array字段的名称
  • colName1 :array字段的别名,随便起
 

举例

  • mapcol :map字段名称
  • key1:key的别名 随便起
  • value1:value的别名 随便起
 

举例

区别

  • posexplode只能用于array,而explode可以用于array,map
  • posexplode还会返回元素在集合中的位置

那么,解决的问题到底是什么

sql语法

  • ⚠️lateral view 一定要在udtf函数的前面
  • ⚠️虚拟表别名一定要加,不然会报错
 

举例

 
 
 
 
 
 

首先对字段A从小到大进行排序。

1.按照排序后的一行一行作为窗口,从第一行开始,第一行的字段A最小,发现自己是最小的,那就当前行做为第一个窗口,计算结果只有本身,结果返回给第一行。

2.从第二行开始继续寻找,负无穷到当前行的,第二个窗口包含第一行、第二行数据,做范围内运算,sum=第一行的字段A+第二行的字段A,结果返回给第二行。

第三个窗口,包含第一行、第二行、第三行数据,那么计算sum=第一行字段A+第二行字段A+第三行字段A。

以此类推。。。。

最后一行的返回的计算结果一定是所有行字段A的总和

那这跟直接sql写sum+group by 有什么区别吗

⭐️区别在于,每行数据都会参与到计算中来,同时得到窗口计算的结果,我们直接写sql语句调用sum)只会返回最终结果,相当于只有最后一个窗口的值。

between相当重要的原因是按照什么样的规则定义窗口。

  • unbounded preceding 表示负无穷
  • current row 基于行的方式表示当前行,基于值的方式表示当前值
  • unbounded following 表示正无穷
  • [num] preceding 基于行的方式 表示当前行的前几行,基于值的方式 表示当前值减去num
  • [num] following 基于值的方式 表示当前行的后几行,基于值的方式表示当前值加上num

between规则应用的不一样

同样都是between unbounded preceding and cureent now

基于行的含义是负无穷到当前行,而基于值的含义是负无穷到当前值

也就说基于行 会以自己的行 为终点但是基于值 会 查找某个字段 小于等于自己的,自己的行不一定是终点。

如下图所示

order_id为1的查找order_date小于等于自己的,只有本身,total_amount为自己

order_id为2的查找order_date小于等于自己的,有order_id为1,order_id为2,order_id为3,total_amount为10+20+10

order_id为3的查找order_date小于等于自己的,有order_id为1,order_id为2,order_id为3,total_amount为10+20+10

如果不开分区,那么窗口的计数从整个数据的开始到结尾

如果开了分区,那么一个分区内窗口计数从分区头到分区尾

说白了,第二个分区的实际数据即使在表的中间,也有可能属于第一个窗口

基于行的语法

  • 字段1,字段2 不用说了,就是显示的字段

  • ⭐️ sum(字段3) 是基于窗口做什么操作,这个表示是基于每个窗口对 sum3字段做求和操作

  • ⭐️ over()表示是什么样的窗口

    字段2:针对字段2进行划分窗口

    rows:表示基于行

    between unbounded preceding and current row表示负无穷到最后一行

 

基于值的语法

  • range:表示基于值
  • unbounded preceding and unbounded following: 表示负无穷到正无穷
 

加分区:

跟基于行 基于值没有关系

  • partition by 字段1 表示针对字段1做分区
 
 
  • 就什么都不加,over(字段)相当于 基于行做窗口,范围是负无穷到正无穷,相当于所有字段作为一个窗口
  • over(order by 字段) 排序后基于值做窗口,范围是负无穷到当前行
  • ⭐️无论基于行还是基于值不加order by,没有任何意义(因为你都不知道上一行和下一行的值有没有关联),做范围内计算也是白瞎

支持以下几种,不再多阐述
max
min
sum
avg
count

分别包括

lag和lead(不支持自定义窗口)

  • lag(): 按照 所在行的偏移量 取 前面的第几行

  • lead(): 按照 所在行的偏移量 取 后面的第几行

first_value和last_value(支持自定义窗口)

  • first_value():当前窗口内所有行数据中的最小值
  • last_value(): 当前窗口内所有行数据中的最大值

⚠️要注意,lag和lead不能使用自定义窗口,因为已经规定好了具体某一行与当前行作为一个窗口,不能再定义是负无穷到正无穷这样自定义的规则。

lag和lead

语法

  • lag() :

    • 字段3:结果字段

    • 1: 取当前行前面的前1行

    • ‘1970-01-01’:当前所在行数取不够前面的行,取默认行(比如取前5行,但是当前行数是第四行,就取值为(‘1970-01-01’)的所在行

  • lead :

    同上

语法如下

 

举例

  • 现在要获取当前订单的上一个订单的时间跟下一个订单的时间(统计一下时间间隔

  • 可以看到,lag根据order_date做一个跨行,先按照时间排序(over order by )后

first_value和last_value

语法

  • first_value(字段3,FALSE) 字段3表示具体取哪个字段的值,false表示允许null的值作为结果,如果窗口内某一行是null值,结果就是null
 
 
 

dense_rank() 如果相同的值,给一样的名次

row_number() 如果相同的值,按照插入表的顺序分名次

1)表结构

order_iduser_iduser_nameorder_dateorder_amount11001小元2022-01-011021002小海2022-01-021531001小元2022-02-032341002小海2022-01-042951001小元2022-01-0546

2)建表语句

 
 

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

期望结果

order_iduser_iduser_nameorder_dateorder_amountsum_so_far11001小元2022-01-01101051001小元2022-01-05465681001小元2022-01-085010631001小元2022-02-032312961001小元2022-04-064217121002小海2022-01-02151541002小海2022-01-04294471002小海2022-01-07509491003小辉2022-04-086262101003小辉2022-04-0962124121003小辉2022-04-1175199141003小辉2022-04-1394293111004小猛2022-05-101212131004小猛2022-06-128092

(2)需求实现

 

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

(1)期望结果

order_iduser_iduser_nameorder_dateorder_amountsum_so_far11001小元2022-01-01101051001小元2022-01-05465681001小元2022-01-085010631001小元2022-02-03232361001小元2022-04-06424221002小海2022-01-02151541002小海2022-01-04294471002小海2022-01-07509491003小辉2022-04-086262101003小辉2022-04-0962124121003小辉2022-04-1175199141003小辉2022-04-1394293111004小猛2022-05-101212131004小猛2022-06-128080

(2)需求实现

 

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

(1)期望结果

order_iduser_iduser_nameorder_dateorder_amountdiff11001小元2022-01-0110051001小元2022-01-0546481001小元2022-01-0850331001小元2022-02-03232661001小元2022-04-06426221002小海2022-01-0215041002小海2022-01-0429271002小海2022-01-0750391003小辉2022-04-08620101003小辉2022-04-09621121003小辉2022-04-11752141003小辉2022-04-13942111004小猛2022-05-10120131004小猛2022-06-128033

(2)需求实现

 

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

(1)期望结果

order_iduser_iduser_nameorder_dateorder_amountfirst_datelast_date11001小元2022-01-01102022-01-012022-01-0851001小元2022-01-05462022-01-012022-01-0881001小元2022-01-08502022-01-012022-01-0831001小元2022-02-03232022-02-032022-02-0361001小元2022-04-06422022-04-062022-04-0621002小海2022-01-02152022-01-022022-01-0741002小海2022-01-04292022-01-022022-01-0771002小海2022-01-07502022-01-022022-01-0791003小辉2022-04-08622022-04-082022-04-13101003小辉2022-04-09622022-04-082022-04-13121003小辉2022-04-11752022-04-082022-04-13141003小辉2022-04-13942022-04-082022-04-13111004小猛2022-05-10122022-05-102022-05-10131004小猛2022-06-12802022-06-122022-06-12

(2)需求实现

 

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

(1)期望结果

order_iduser_iduser_nameorder_dateorder_amountrkdrkrn81001小元2022-01-085011151001小元2022-01-054622261001小元2022-04-064233331001小元2022-02-032344411001小元2022-01-011055571002小海2022-01-075011141002小海2022-01-042922221002小海2022-01-0215333141003小辉2022-04-1394111121003小辉2022-04-117522291003小辉2022-04-0862333101003小辉2022-04-0962334131004小猛2022-06-1280111111004小猛2022-05-1012222

(2)需求实现

最新文章
日照网络推广哪家强推广好
在日照进行网络推广时,选择合适的公司或者平台是关键,以下是一些值得考虑的因素和推荐方式: 1. 本地化网络推广公司 一些本地的网络推广公司可能会更加了解日照市场的特性、消费者习惯及竞争情况,因此,选择一家熟悉本地市场的公司能帮
百度推广优化秘籍,设置技巧全攻略与实操手册
百度推广优化涉及全面设置技巧和操作指南,旨在提升广告效果。本文详细解析关键词、创意、出价、投放时间等关键要素,提供实操步骤,助您高效运用百度推广。在当今数字化时代,已成为众多企业进行网络营销的重要手段,为了提高推广效果,优
淘宝直播间怎么增流量?方法介绍(淘宝直播间怎么清屏看直播)
淘宝直播间作为一种新兴的营销方式,对于卖家来说是一个非常重要的渠道。然而,很多卖家在使用淘宝直播间时面临一个共同的问题,那就是如何增加流量。下面将为大家介绍一些有效的方法,帮助卖家增加淘宝直播间的流量。一、优化直播间页面首
自动裂变引流+自动成交+网盘拉新,虚拟资源暴利玩法,轻松躺赚
​​你好,我是策哥。 新来的朋友,可以先看一下我的个人介绍,对我以及我们的团队,先有个了解, 点击查看:策哥的个人介绍 最近10年,创业最好的方向,必定是互联网!  因为互联网不需要场地,不需要人工,不需要设备。每天只需要花
八个实用的Python“无代码”功能
近几年 Python 语言之所以流行,是因为我们可以使用它编写更少的代码来实现复杂的功能。Python 开发者社区非常欢迎那些封装了复杂实现但是对使用者十分友好的工具包。然而,Python 的简便性不止如此。你能相信我们可以在不写任何代码的情况
涉案2000多万,68人被抓!藏在阳光100的这...
本文原标题:《涉案2000多万,68人被抓!藏在阳光100的这家公司,扯出特大案件!》柳州、北京、深圳、四川绵阳等地的多名不法分子,结成团伙,成立了多个公司,团伙成员通过非法手段,收集和购买公民信息,以QQ群、微信等方式,在网上分饰
汽车aux连接手机为什么放不了
汽车aux连接手机放不了可能有以下原因和解决办法。一是使用的线或插头不合适可尝试更换一根。二是AUX接口位置不同找到并确认周围有AUX标记连接后将车载音响输入模式设为AUX。三是手机不支持3.5mm耳机接口需购买适配的转接头或适配器购买前
硅谷爆火A股也热闹,低代码赛道再升温,AI要革编程的“命”?
曾于2018年成为国内资本热点的低代码(Low Code)赛道,当下正随着AIGC加速落地热度再起,被部分业内人士视作继AI搜索之后的又一大热门赛道。 据财联社记者观察,前有海外AI编程工具Cursor爆火被称为硅谷“码农”最爱,后有个人用户借助Cur
让人忍不住点赞的说说,句句高格调,总有一句说中你
1、聪明人嘲笑幸福是一个梦,傻瓜到梦中去找幸福,两者都不承认现实中有幸福。看来,一个人要获得实在的幸福,就必须既不太聪明,也不太傻。人们把这种介于聪明和傻之间的状态叫做生活的智慧。5、有天当你想起我,时间已摆平所有的错,也学
【D557(移动4G)川川云手机下载】康佳D557 移动4G川川云手机3.8.0免费下载
川川云手机是一款提供全天候在线服务的虚拟云手机解决方案,旨在为用户的应用和游戏提供不间断的云端运行支持。以下是该产品的主要功能特点:多实例管理与同步:允许用户通过单一设备控制多台云手机,实现多屏幕预览及同步操作功能。同时,
相关文章
推荐文章
发表评论
0评