HSQL之窗口, 聚合和分析函数

HSQL是大数据面试中必须具备的能力, 这里将用一个案例串通这三个常用且难点函数. 学习Hsql, 多敲多练, 方能熟能生巧.

1.创建hive表:

create table window_function_temp(uname string, create_time string,pv string);

2.初始化测试数据:

insert overwrite table dw_tmp.window_function_temp
select
split(detail,',')[0] as uname
,split(detail,',')[1] as create_time
,split(detail,',')[2] as pv
from
(selectconcat('测试用户,2019-10-02,7#测试用户,2019-10-05,4#测试用户,2019-10-07,5#测试用户,2019-10-03,6#测试用户,2019-10-04,3#测试用户,2019-10-01,3#测试用户,2019-10-06,4') as ct_str
) t
lateral view explode(split(ct_str,'#')) t2 as detail;

这里扩展一下里面的重要函数:

split()函数是用于切分数据,也就是将一串字符串切割成了一个数组 ;

explode()函数用于打散行的函数(将一行的数据拆分成多行,它的参数必须为map或array)。这个函数常和split()并用

lateral view :全连接. 一个select后面只能获得一个explode产生的视图,如果要显示多个列,则需要将多个视图合并。

3.窗口函数: lead(col,n,default)和 lag(col,n,default)

​ lead用于统计窗口内往下第n行值第一个参数为列名,第二个参数为往下第n行(可选,默认为1,不可为负数),第三个参数为默认值(当往下第n行为null时候,取默认值,如不指定,则为null)

lag用于统计窗口内往上第n行值第一个参数为列名,第二个参数为往上第n行(可选,默认为1,不可为负数),第三个参数为默认值(当往上第n行为null时候,取默认值,如不指定,则为null)

select
uname
,create_time
,pv
,lead(pv,1,-9999) over (partition by uname order by create_time) as lead_1_pv
,lag(pv,1,-9999) over (partition by uname order by create_time) as lag_1_pv
from dw_tmp.window_function_temp;

4.first_value和last_value

first_value取分组内排序后,截止到当前行,第一个值,这最多需要两个参数。第一个参数是您想要第一个值的列,第二个(可选)参数必须是false默认为布尔值的布尔值。如果设置为true,则跳过空值。

last_value取分组内排序后,截止到当前行,最后一个值,这最多需要两个参数。第一个参数是您想要第一个值的列,第二个(可选)参数必须是false默认为布尔值的布尔值。如果设置为true,则跳过空值。

following: 往后

current row:当前行

unbounded:起点(一般结合preceding,following使用)

unbounded preceding 表示该窗口最前面的行(起点)

unbounded following:表示该窗口最后面的行(终点)

select
uname
,create_time
,pv
,first_value(pv) over (partition by uname order by create_time rows between unbounded preceding and current row) as first_value_pv
,last_value(pv) over (partition by uname order by create_time rows between unbounded preceding and current row) as last_value_pv
from dw_tmp.window_function_temp;

5.聚合函数:count(), sum(), min(), max, avg()

select
uname
,create_time
,pv
,SUM(pv) over (partition by uname order by create_time) as sum_pv_1 --默认情况
,SUM(pv) over (partition by uname order by create_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as sum_pv_2 --表示从起点到当前行
,SUM(pv) over (partition by uname) as sum_pv_3 --表示窗口内所有行
,SUM(pv) over (partition by uname order by create_time ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as sum_pv_4 --表示起点到终点
,SUM(pv) over (partition by uname order by create_time ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING) as sum_pv_5 --表示前2行到后面1行
from dw_tmp.window_function_temp;

6.分析函数: row_number, rank, dense_rank, cume_dist, percent_rank, ntile

row_number:从1开始,按照顺序,生成分组内记录的序列,row_number()的值不会存在重复,当排序的值相同时,按照表中记录的顺序进行排列;通常用于获取分组内排序第一的记录;

rank: 生成数据项在分组中的排名,排名相等会在名次中留下空位

dense_rank: 生成数据项在分组中的排名,排名相等会在名次中不会留下空位

cume_dist: 小于等于当前值的行数/分组内总行数

percent_rank: 分组内当前行的RANK值-1/分组内总行数-1

ntile: NTILE(n) 用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布。ntile不支持rows between

select
uname
,create_time
,pv
,ROW_NUMBER() over (partition by uname order by pv) as row_number_pv_1
,RANK() over (partition by uname order by pv) as row_number_pv_2
,DENSE_RANK() over (partition by uname order by pv) as row_number_pv_3
from dw_tmp.window_function_temp;

HSQL之窗口-聚合-分析函数相关推荐

  1. java Flink滚动时间窗口聚合TumblingProcessingTimeWindows运算例子

    整个的思路是: 构造数据源 窗口聚合代码 1. 构造数据源 首先构造数据,新建一个MyData2.java的文件,写入这个MyData2的类 package create_data;import ja ...

  2. Flink的窗口聚合操作(Time\Count Window)

    窗口基本概念:Flink中的窗口是左闭右开的窗口 Flink认为批处理是流处理的一个特例,而窗口window就是从流处理到批处理的一个桥梁,通常来讲窗口就是用来将无线数据流转换为优先数据集,从而在优先 ...

  3. Flink AggOperatorWholeWin 全窗口聚合函数

    全窗口聚合函数(full window functions) 1.先把窗口所有数据收集起来 2.窗口关闭时,遍历所有数据 ProcessWindowFunction 全窗口函数相比累加窗口函数好的优势 ...

  4. 【高德地图API】从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物

    原文地址为: [高德地图API]从零开始学高德JS API(三)覆盖物--标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物 摘要:覆盖物,是一张地图的灵魂.有覆盖物的地图,才是完整的 ...

  5. 【Flink】各种窗口的使用(处理时间窗口、事件时间窗口、窗口聚合窗口)

    文章目录 一 Flink 中的 Window 1 Window (1)Window概述 (2) Window类型 a 滚动窗口(Tumbling Windows) b 滑动窗口(Sliding Win ...

  6. oracle分析函数以及窗口,Oracle分析函数与窗口函数

    一.默认窗口与排名函数 最常用的分析函数是排名函数,用于返回当前记录在窗口中的位置.常用的排名函数包括rank().dense_rank().row_number()等.排名函数所对应的窗口函数必须指 ...

  7. js添加多marker 高德地图_【高德地图API】从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物...

    摘要:覆盖物,是一张地图的灵魂.有覆盖物的地图,才是完整的地图.在一张地图上,除了底层的底图(瓦片图,矢量图),控件(有功能可操作的工具),最重要最不可缺少的就是覆盖物了.覆盖物有多种,包括,标注.折 ...

  8. Flink窗口聚合案例(增量聚合、全量聚合)

    上面我们time window和count window讨论了聚合,下面我们从另外一个角度对window进行分类,从聚合角度. window的集合操作分为2种:一种是增量聚合,一种时候全量聚合,增量聚 ...

  9. sql 精读(一)标准 SQL 中的分析函数概念

    分析函数针对一组行计算值,并为每行返回一个结果.这与聚合函数不同:聚合函数会为整组行返回一个结果. 分析函数包含一个 OVER 子句,该子句定义了涵盖所要计算行的行窗口.对于每一行,系统会使用 - 选 ...

  10. mysql开窗函数over_oracle分析函数技术详解(配上开窗函数over())

    一.Oracle分析函数入门 分析函数是什么? 分析函数是Oracle专门用于 解决复杂报表统计需求 的功能强大的函数, 它可以在数据中进行分组然后计算基于组的某种统计 ,并且每一组的每一行都可以返回 ...

最新文章

  1. 用JS查看修改CSS样式(cssText,attribute('style'),currentStyle,getComputedStyle)
  2. wtl单文档选项_Vite 中文文档翻译
  3. HDU4082(相似三角形的个数)
  4. zone.js在bootstrap阶段对window对象里一些标准方法的注入逻辑
  5. const int *p与int *const p的区别
  6. svn拷贝一个项目作为新项目
  7. python自动测试模型_Selenium+Python 自动化测试模型
  8. Flash存储的故事
  9. ubuntu 18.04 gnome shift键失灵
  10. 【微信小程序云开发 云数据库 云函数 云存储】
  11. 去掉台电U盘加密大师
  12. maven 添加外部jar包到本地仓库
  13. Java线程(五):Executors、ThreadFactory
  14. Instant类使用
  15. java桌面端开发为什么没就行起来,大部分人选qt,winform,electron?
  16. ESP32 开发笔记(四)littleVGL LVGL 控件学习 Arc 弧形控件
  17. 48个值得推荐的免费英文有声读物网站
  18. excel打开之后很小
  19. 保姆级zookeeper集群搭建(leader+follower模式)
  20. 电脑同时登录多个微信

热门文章

  1. Verilog基础语法(一)
  2. 正交性原理与维纳霍夫(正则)方程
  3. 【操作系统】Ubuntu 16 编译链接 .cpp 和 .asm 文件
  4. idea Translation 使用有道翻译
  5. Arduino DY-SV17F自动语音播报
  6. 计算机基础多选试题及答案,计算机基础试题及答案
  7. WinDriver高级编程
  8. 【2021版】想要专升本你不得不看的全干货_吐血整理_专升本_计算机文化基础(四)
  9. caxa自动保存的文件在哪里_怎样删除CAXA的临时文件
  10. 服务器lsass系统错误,急急急开机出现lsass.exe系统错误系统资源不够无法完成AP? 爱问知识人...