分享好友 最新动态首页 最新动态分类 切换频道
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)需求实现

最新文章
百度怎么开户投放广告
百度怎么开户投放广告?作为中国最大的搜索引擎,百度每天都要处理数以亿计的搜索请求,这也为广告主们提供了一个广阔的广告投放平台。如何在百度上开户并投放广告,让自己的品牌和产品得到更好的曝光和推广,是许多广告主关注的问题。本文
高清美女写真生成:超简单的AI绘图工具推荐与使用指南
限时免费,点击体验最近超火的AI生图神器,坐拥3000美女的大男主就是你! https://ai.sohu.com/pc/generate/textToImg?_trans_=030001_yljdaimn 宝子们,想象一下,你在家里随便拍拍,竟能产生出超逼真的美女写真,这不是电影里的情节,而
sem竞价代运营公司主要负责哪些工作?揭秘sem代运营的核心职责!
在数字营销这片浩瀚的海洋中,SEM竞价代运营公司就像那艘稳健的航船,载着企业在波涛汹涌的市场中破浪前行。那么,这些代运营公司究竟负责哪些工作?他们又是如何助力企业实现营销目标的呢?今天,咱们就来揭秘SEM代运营的核心职责,让您对
以图搜图
点击详情进入查看更多搜图工具网站服务:常用搜索,以图搜图,识图,以图搜图,图像检索,图像识别,图片识别,图片搜索,图像搜索,识图,搜图,找图,拍图,拍照,常用推荐,常用搜索,以图搜图。百度图像搜索-领先的图像识别技术连接人
长沙NOIP信息学奥赛集训营咨询热线:   在线咨询: 点击交谈
长沙NOIP信息学奥赛信息 长沙NOIP信息学奥赛集训营是长沙青少儿教育品牌,形成了以乐高创意启蒙课程、人工智能编程、智能机器人编程、信息学奥赛编程等课程体系为核心,集国内外大型权威科技赛事、少儿资格认证考试、科技主题的国内外游学
微信小程序如何获取链接
微信小程序的链接获取是开发者在开发过程中需要注意的一个重要问题。链接是小程序中不可或缺的元素,它可以在不同页面之间进行导航和跳转,为用户提供丰富的交互体验。这篇文章将介绍如何在微信小程序中获取链接,并提供一些实用的技巧和注
阅读与写作兴趣班教学计划
阅读与写作兴趣班教学计划(通用12篇)  时间就如同白驹过隙般的流逝,前方等待着我们的是新的机遇和挑战,现在就让我们好好地规划一下吧。计划到底怎么拟定才合适呢?以下是小编为大家收集的阅读与写作兴趣班教学计划,希望对大家有所帮
【C8600360清理大师下载】华为C8600360清理大师8.4.2免费下载
清理大师:更简单,更畅快!6亿用户信赖的手机清理!清理大师是一款完全免费的手机加速与空间清理软件,强力加速使手机运行更流畅,一键清理快速解决空间不足问题。【一键清理】一键搞定无用垃圾,手机清理更省心【手机加速】瞬间释放手机
《时代》专访ChatGPT之父:人工智能影响经济还需要很多年
划重点:① OpenAI的首席执行官山姆·奥特曼(Sam Altman)曾表示,如果使用不当,人工智能会让所有人都消亡。② 在倡导人工智能可能性的同时,奥特曼敦促政策制定者制定规则和通过监管来减轻人工智能可能带来的危险。奥特曼倡导用普世的基
抖音直播突围:封闭外链中的外链建设策略169
## 网站外链规划师:抖音直播封闭外链外链建设方案 #### ## 一、背景分析抖音平台对外部链接的限制日益严格,使得传统的外链建设方式难以奏效。为了突破这一限制,需要制定针对性的外链建设策略。## 二、目标设定* 增加高质量的反向链接*
相关文章
推荐文章
发表评论
0评