HIVE 窗口函數實戰

2020-12-14 小小小架構師

在上一篇#HIVE 窗口函數詳解中,我們介紹了hive窗口函數的定義和語法,本篇中我們根據例子來進行實戰。

數據準備

首先我們來定義測試表結構,建立一張student_score學生分數表,主要三個欄位,學生,班級,成績,如下圖所示

排序窗口

接下來準備數據,為了方便,我們直接採用插入的方式,如下圖所示

最後我們的數據如下圖所示:

排序窗口

需求:求每個班級成績排名前三的學生。

row_number()函數,唯一排序,不會生成排序相同的用戶

示例和結果如下:

可以看到,一班的學生三和學生四同樣為90分的學生,會按照不同的排名進行排名。

rank()函數,不唯一排序,相同分數排名會相同,但後續排名會跳過。

示例和結果如下圖:

可以看到,一班的學生三和學生四,分數都為90分,排名都同樣為1,同時,一班的學生二為40分,排名為3,直接跳過了排名為2,所以一般沒有排名為2的學生。

dense_rank()函數,不唯一排序,排名相同的分數排序會相同,和rank()不同的時,後續排名不會跳過。

示例和結果如下圖

可以看到,一班的學生三和學生四,分數都為90分,排名並列第一,而學生二分數低於他們,排名為第二。

聚合窗口

聚合窗口能使用的有count,sum,avg,max,min。

這裡,我們以sum舉例,其他函數請舉一反三

需求: 求每個班級的學生中該學生和他上一個學號及下一個學號的學習總分。

其他類似需求,截止至當前月的銷售額,最近三個月的銷售額這種。

示例和結果如下圖

可以看到,學生一沒有學號比他低的,只有學號比他高的學生二,故總分為10+40=50分

學生二有學號比他低的學生一和學號比他高的學生三,故總分為10+40+90=140

學生四有學號比他低的學生三,學生五學號雖然比學生四高,但是屬於不同班級,故不記錄,所以最後總分為90+90=180

其他窗口

lag(col, n, DEFAULT) 用於統計窗口內向上第n行的值

lead請參考lag

需求:分班級,求上一個學號的學生成績。

示例和結果如下圖:

可以看到學生一上一個學號沒有,所以上一個分數為null

學生二上一個學生為學生一,所以上一個分數顯示10

cume_dist

計算某個窗口或分區中某個值的累積分布。假定升序排序,則使用以下公式確定累積分布:(小於等於當前值的行數) / (分區內總行數)

比如,統計小於等於當前薪水的人數,所佔總人數的比例

需求:計算班級內小於等於自己的比例

示例和結果如下圖:

如圖所示,一班一共有4個人

學生一分數最低,所以為1/4=0.25

學生二的分數為40,<=40的有學生一和學生二,所以為2/4=0.25

學生三和學生四的分數為90,最高,所以為4/4=1

ntile

作用:將分區中的數據按照順序劃分為N片,返回當前片的值。

注1:如果切片分布不均勻,默認增加第一個切片的分布注2:ntile不支持ROWS BETWEEN

需求:分班級,將數據分為2份,返回份數

示例和需求如下:

可以看到,一班一共有4個人,按照成績,10,40屬於低分區,故歸屬於第一份,90,90屬於高分區,故歸屬於第二份。

percent_rank

計算給定行的百分比排名。分組內當前行的RANK值-1/分組內總行數-1,可以用來計算超過了百分之多少的人。

需求,計算成績在班級內的百分位

示例和結果如下圖

可以看到,二班內的學生五成績最低,rank為1,(1-1)/(4-1)=0

學生六和學生七同為50分,rank為2,結果為(2-1)/(4-1)=0.33

學生八最高,rank為4,結果未(4-1)/(4-1)=1

相關焦點

  • Hive窗口函數/分析函數詳解
    hive窗口函數/分析函數在sql中有一類函數叫做聚合函數,例如sum()、avg()、max()等等,這類函數可以將多行數據按照規則聚集為一行,一般來講聚集後的行數是要少於聚集前的行數的。但是有時我們想要既顯示聚集前的數據,又要顯示聚集後的數據,這時我們便引入了窗口函數。窗口函數又叫OLAP函數/分析函數,窗口函數兼具分組和排序功能。
  • HIVE 窗口函數詳解
    什麼是窗口函數窗口函數是 SQL 中一類特別的函數。和聚合函數相似,窗口函數的輸入也是多行記錄。不 同的是,聚合函數的作用於由 GROUP BY 子句聚合的組,而窗口函數則作用於一個窗口, 這裡,窗口是由一個 OVER 子句 定義的多行記錄。聚合函數對其所作用的每一組記錄輸 出一條結果,而窗口函數對其所作用的窗口中的每一行記錄輸出一條結果。一些聚合函 數,如 sum, max, min, avg,count 等也可以當作窗口函數使用。
  • Hive窗口函數row number的用法, 你肯定都會吧!
    row_number前面我們介紹窗口函數的時候說到了窗口函數的使用場景,我們也給它起了一個名字進行區分,通用窗口函數和特殊窗口函數,今天我們就來看一下排序相關的窗口函數,因為是窗口函數,並且我們說它是用來排序的,我們大概也能猜到它就是用來對窗口內的數據進行排序的其實關於排序我們前面也介紹過order by,sort by 等排序的方式Hive語法之常見排序方式
  • Hive窗口函數總結與實踐
    order by子句會讓輸入的數據強制排序(窗口函數是SQL語句最後執行的函數,因此可以把SQL結果集想像成輸入數據)。Order By子句對於諸如Row_Number(),Lead(),LAG()等函數是必須的,因為如果數據無序,這些函數的結果就沒有任何意義。因此如果有了Order By子句,則Count(),Min()等計算出來的結果就沒有任何意義。
  • Hive(七) ----函數
    窗口函數又叫開窗函數,屬於分析函數一種,解決複雜報表統計需求的功能。用於計算基於組的某種聚合值,和聚合函數不同,對於每個組返回多行,聚合函數隻返回一行。窗口函數制定了分析函數工作的數據窗口大小,這個數據窗口大小可能會隨著行的變化而變化。
  • Hive 窗口函數最全講解和實戰
    一、窗口函數的概念
  • Hive的分析函數的使用
    我們先準備資料庫、表和數據開窗分析函數相對於mysql中的聚合函數區別是:分析函數是基於某個組多個數據進行計算聚合,而聚合函數是每個組返回一行數據。FOLLOWING 最後一行所以上面的語句我們變動下select empno,ename,deptno,sal, max(sal) over(partition by deptno order by sal desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as sal_max from emp;可以控制窗口大小
  • Hive數據倉庫實戰
    *-bin.jar到/home/hadoop/software/hadoop2hive/lib目錄下,Hive客戶端啟動的時候會自動加載這個目錄下的所有jar包。部署就這麼簡單,我們在Linux的客戶端輸入Hive回車就進去控制臺命令窗口,後面就可以建表、查詢數據、更新等操作了。下面我們看下Hive的常用SQL操作。
  • Hive常用的函數總結
    sqrt()函數表示對給定的數字取平方根,如下所示:hive (default)> SELECT Sqrt(5);OK_c02.23606797749979Time taken: 0.06 seconds, Fetched: 1 row(s)2、集合函數
  • 【乾貨】Hive常用函數大全
    舉例:hive> select ceil(3.1415926) from lxw_dual;4hive> select ceil(46) from lxw_dual;465、向上取整函數: ceiling語法: ceiling(double a)
  • Hive窗口函數進階指南
    作為一名數據小哥,在寫SQL的漫漫路上,窗口函數猶如一把披荊斬棘的利劍,幫助作者解決了很多繁瑣複雜的需求,
  • hive常用函數
    3.窗口函數累計計算窗口函數•sum(A)over(partition by B order by C rows between D1 and D2)•avg(A)over(partition by B order by C rows between D1 and D2)    1.rows between unbounded preceding and current
  • 常用Hive函數的學習和總結
    今天來小結一下工作中經常會使用到的一些Hive函數。關於Hive函數的總結,網上早有十分全面的版本。參考:https://blog.csdn.net/doveyoung8/article/details/80014442。本文主要從最常用和實用的角度出發,說明幾個使用頻率較高的函數,更注重使用函數組合來解決實際問題而不局限於單個函數的使用。
  • 【Hive】SQL | 窗口函數詳解
    前一篇文章【Hive】SQL | 窗口函數入門,對 Hive SQL 中的窗口函數進行一個初步的介紹,本文對窗口函數進行更加系統的介紹。
  • hive函數
    Hive是建立在 Hadoop 上的數據倉庫基礎架構,定義了簡單的類 SQL 查詢語言(HQL)函數分類:簡單內置函數
  • hive sql 優化心得
    下面為大家介紹一下hive的優化器以及一些常見的sql技巧。常見的優化器如果你想查看hive的優化器,可以從github上面拉一份hive的源碼,在org.apache.hadoop.hive.ql.optimizer目錄下可以看到hive裡面有哪些邏輯優化器。
  • Hive與MapReduce相關排序及自定義UDF函數
    Hive和mapreduce相關的排序和運行的參數1.設置每個reduce處理的數據量(單位是字節)我們在hive中查看下配置文件hive-site.xml.template默認設置在hive中可以看到如果我們使用下面的排序,是否reduce的數量有關係呢?
  • hive之窗口函數和自定義函數
    前言本篇主要講解常用的幾個窗口函數,以及如何自定義函數
  • 大數據分析師工程師入門6-HIVE進階
    窗口函數要講HIVE進階,窗口函數不得不提,作者之前的文章《Hive窗口函數進階指南》已經很詳細地講解了這部分內容,為了省去大家點連結跳來跳去的麻煩,下面將其核心內容摘錄出來,如下所示。 窗口函數也稱為OLAP(OnlineAnalytical Processing)函數,是對一組值進行操作,不需要使用Group by子句對數據進行分組,還能在同一行返回原來行的列和使用聚合函數得到的聚合列。
  • 一文搞定Hive函數,建議收藏!
    導讀:工欲善其事必先利其器,hive是我們與大數據打交道的工具,所以我們需要熟練使用hive的一些函數,這樣後面的數據開發就得心應手啦。廢話不多說直接上乾貨。目錄如下1、數據準備2、字符函數3、聚合函數4、數學函數5、時間函數