數(shù)據(jù)分析EPHS(11)-詳解Hive中的排序函數(shù)

本篇主要來介紹一下hive中三個常用的排序函數(shù)row_number(),rank()和dense_rank()。

1悄但、數(shù)據(jù)

先來看一下我們的數(shù)據(jù)。我們使用spark往hive數(shù)據(jù)庫中寫入數(shù)據(jù):

import spark.implicits._

    val seqData = Seq(
      ("1班","小A","70"),
      ("2班","小B","84"),
      ("3班","小C","70"),
      ("1班","小D","89"),
      ("1班","小E","70"),
      ("2班","小F","90"),
      ("3班","小G","85"),
      ("3班","小H","68"),
      ("2班","小I","96"),
      ("1班","小J",null)
    )

    val seq2df = seqData
      .toDF("class","student","score")

    seq2df.write.saveAsTable("default.classinfo3")

數(shù)據(jù)結(jié)構(gòu)如下:

為了方便后續(xù)的介紹缕探,我們將幾名同學的成績設(shè)置為同樣的分數(shù)翎蹈。在介紹具體的函數(shù)前,咱們先簡單介紹下over遍愿。

row_number(),rank()和dense_rank()都是結(jié)合over來進行使用的存淫,over的一般結(jié)構(gòu)如下:

over(partition by col1 order by col2 asc/desc)

一般來說,需要指定以下三項:
1沼填、partition by col1桅咆,按哪列進行分組,如果不指定坞笙,則默認按全局進行排序岩饼,如果指定了一列荚虚,則首先對數(shù)據(jù)按照指定的列進行分組,然后進行組內(nèi)排序籍茧。
2版述、order by col2,指定按哪列進行排序硕糊,這個是必須要指定的院水,不指定會報錯。
3简十、asc/desc,按升序或降序進行排列撬腾,不指定的話螟蝙,默認是升序。

當然民傻,除了本文介紹的方法外胰默,over還可以結(jié)合其他許多函數(shù),如lag/lead/sum等漓踢,后續(xù)我們會繼續(xù)介紹牵署。

2、row_number()

使用row_number()進行排序喧半,即使排序列取值相同奴迅,仍然會賦予不同的排名,比如我們按照全局進行降序排序:

select
 *,
 row_number() over(order by score desc) as rank
from
 default.classinfo3

輸出結(jié)果如下:

我們有以下結(jié)論:
1挺据、可以看到小A取具、小C、小E的分數(shù)都是70分扁耐,但排名分別是6暇检、7和8。
2婉称、我們故意在數(shù)據(jù)中插入了一個null值块仆,可以看到,按降序排的話null值的排名是最低的王暗。如果按升序排列悔据,那么null則會排名第一。
3瘫筐、row_number()的排序從1開始蜜暑,而我們上一篇介紹的posexplode是從0開始的。

然后再看下按班級排名的結(jié)果:

select
 *,
 row_number() over(partition by class order by score desc) as rank
from
 default.classinfo3

結(jié)果如下:

這里留一個小疑惑策肝,對于排序列相同取值的結(jié)果肛捍,是怎么決定其對應的排名的呢隐绵?

3、rank()

再來看下rank拙毫,使用rank進行排序依许,如果排序列取值相同,那么其排名相同缀蹄,假設(shè)有3名同學排名第1峭跳,那么下一名同學的排名直接變?yōu)榈?。通過sql驗證下:

select
 *,
 rank() over(order by score desc) as rank
from
 default.classinfo3

可以看到缺前,小A蛀醉、小C和小E的排名都是第6,可憐的小H直接排名第9了衅码。同時對于null值的排序跟row_number()相同拯刁。

4、dense_rank()

最后來看下dense_rank逝段,使用dense_rank進行排序垛玻,如果排序列取值相同,那么其排名相同奶躯,假設(shè)有3名同學排名第1帚桩,那么下一名同學的排名是2,而非4嘹黔。通過sql驗證下:

select
 *,
 dense_rank() over(order by score desc) as rank
from
 default.classinfo3

結(jié)果如下:

可以看到账嚎,小A、小C和小E的排名都是第6参淹,小H排名是第7而非第9醉锄。同時對于null值的排序跟row_number()相同。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浙值,一起剝皮案震驚了整個濱河市恳不,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌开呐,老刑警劉巖烟勋,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異筐付,居然都是意外死亡卵惦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門瓦戚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沮尿,“玉大人,你說我怎么就攤上這事⌒蠹玻” “怎么了赴邻?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長啡捶。 經(jīng)常有香客問我姥敛,道長,這世上最難降的妖魔是什么瞎暑? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任彤敛,我火速辦了婚禮,結(jié)果婚禮上了赌,老公的妹妹穿的比我還像新娘墨榄。我一直安慰自己,他們只是感情好揍拆,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布渠概。 她就那樣靜靜地躺著,像睡著了一般嫂拴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贮喧,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天筒狠,我揣著相機與錄音,去河邊找鬼箱沦。 笑死辩恼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的谓形。 我是一名探鬼主播灶伊,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寒跳!你這毒婦竟也來了聘萨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤童太,失蹤者是張志新(化名)和其女友劉穎米辐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體书释,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡翘贮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了爆惧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狸页。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扯再,靈堂內(nèi)的尸體忽然破棺而出芍耘,到底是詐尸還是另有隱情址遇,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布齿穗,位于F島的核電站傲隶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窃页。R本人自食惡果不足惜跺株,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脖卖。 院中可真熱鬧乒省,春花似錦、人聲如沸畦木。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽十籍。三九已至蛆封,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勾栗,已是汗流浹背惨篱。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留围俘,地道東北人砸讳。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像界牡,于是被迫代替她去往敵國和親簿寂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 分析函數(shù)宿亡,也稱為窗口函數(shù)常遂,通常被認為僅對數(shù)據(jù)倉庫SQL有用。使用分析函數(shù)的查詢她混,基于對數(shù)據(jù)行的分組來計算總量值烈钞。與...
    貓貓_tomluo閱讀 3,317評論 3 18
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,448評論 0 13
  • 這一周主要學習了 Hive 的一些基礎(chǔ)知識,學習了多個 Hive 窗口函數(shù)坤按,雖然感覺這些窗口函數(shù)沒有實際的應用...
    大石兄閱讀 2,747評論 2 8
  • pyspark.sql module Module context Spark SQL和DataFrames中的重...
    盜夢者_56f2閱讀 5,419評論 0 19
  • 這是很早之前面的毯欣,第一次面數(shù)據(jù)分析的面試,當時還傻乎乎的以為數(shù)據(jù)分析和數(shù)據(jù)挖掘是一回事呢臭脓。結(jié)果才發(fā)現(xiàn)酗钞,數(shù)據(jù)分析崗位...
    文哥的學習日記閱讀 7,077評論 4 9