Spark從入門到精通27:Spark SQL:開窗函數(shù)實戰(zhàn)

Spark 1.4.x版本以后燃乍,為Spark SQL和DataFrame引入了開窗函數(shù)唆樊,比如最經(jīng)典,最常用的刻蟹,row_number()逗旁,可以讓我們實現(xiàn)分組取topn的邏輯。

案例:統(tǒng)計每個種類的銷售額排名前3的產(chǎn)品
輸入文件sales.txt舆瘪,內(nèi)容如下:


Thin?Cell Phone?6000
Normal?Tablet?1500
Mini?Tablet?5500
UltraThin?Cell Phone?5000
VeryThin?Cell Phone?6000
Big?Tablet?2500
Bedable?Cell Phone?3000
Foldable?Cell Phone?3500
Pro?Tablet?4500
Pro2?Tablet?6500

開始編寫我們的統(tǒng)計邏輯痢艺,使用row_number()開窗函數(shù),先說明一下介陶,row_number()開窗函數(shù)的作用:
其實,就是給每個分組的數(shù)據(jù)色建,按照其排序順序哺呜,打上一個分組內(nèi)的行號,比如說箕戳,有一個分組date=20201001某残,里面有3條數(shù)據(jù),1122陵吸,1121玻墅,1124,那么對這個分組的每一行使用row_number()開窗函數(shù)以后,三行壮虫,依次會獲得一個組內(nèi)的行號澳厢,行號從1開始遞增,比如1122 1囚似,1121 2剩拢,1124 3
代碼實現(xiàn):

package sql;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.hive.HiveContext;

public class RowNumberWindowFunction {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf()
                .setAppName("RowNumberWindowFunction");
        JavaSparkContext sc = new JavaSparkContext(conf);
        HiveContext hiveContext = new HiveContext(sc.sc());
        // 創(chuàng)建銷售額表,sales表
        hiveContext.sql("DROP TABLE IF EXISTS sales");
        hiveContext.sql("CREATE TABLE IF NOT EXISTS sales ("
                + "product STRING,"
                + "category STRING,"
                + "revenue BIGINT)");
        hiveContext.sql("LOAD DATA "
                + "LOCAL INPATH '/usr/local/spark-study/resources/sales.txt' "
                + "INTO TABLE sales");
        DataFrame top3SalesDF = hiveContext.sql(
                "SELECT product,category,revenue from("
                        + "SELECT "
                        + "product,"
                        + "category,"
                        + "revenue,"
                        + "row_number() OVER (PARTITION BY category ORDER BY revenue DESC) rank "
                        + "FROM sales "
                        + ") tmp_sales "
                        + "WHERE rank<=3");
        // 將每組排名前3的數(shù)據(jù)饶唤,保存到一個表中
        hiveContext.sql("DROP TABLE IF EXISTS top3_sales");
        top3SalesDF.saveAsTable("top3_sales");
        sc.close();
    }
}

在第29行的row_number()開窗函數(shù)的語法說明:
首先可以徐伐,在SELECT查詢時,使用row_number()函數(shù)募狂,其次办素,row_number()函數(shù)后面先跟上OVER關(guān)鍵字,然后括號中祸穷,是PARTITION BY性穿,也就是說根據(jù)哪個字段進(jìn)行分組,其次是可以用ORDER BY進(jìn)行組內(nèi)排序粱哼,然后row_number()就可以給每個組內(nèi)的行季二,一個組內(nèi)行號
代碼編寫完成,開始打jar包,發(fā)布到集群提交spark程序胯舷,編寫如下腳本:


提交腳本刻蚯,運行spark程序,運行完成桑嘶,進(jìn)入hive查看:



我們發(fā)現(xiàn)炊汹,原數(shù)據(jù)和統(tǒng)計后的數(shù)據(jù)都正常寫入hive,至此逃顶,銷售額排名前3的產(chǎn)品統(tǒng)計完成讨便。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市以政,隨后出現(xiàn)的幾起案子霸褒,更是在濱河造成了極大的恐慌,老刑警劉巖盈蛮,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件废菱,死亡現(xiàn)場離奇詭異,居然都是意外死亡抖誉,警方通過查閱死者的電腦和手機(jī)殊轴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袒炉,“玉大人旁理,你說我怎么就攤上這事∥掖牛” “怎么了孽文?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夺艰。 經(jīng)常有香客問我叛溢,道長,這世上最難降的妖魔是什么劲适? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任楷掉,我火速辦了婚禮,結(jié)果婚禮上霞势,老公的妹妹穿的比我還像新娘烹植。我一直安慰自己,他們只是感情好愕贡,可當(dāng)我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布草雕。 她就那樣靜靜地躺著,像睡著了一般固以。 火紅的嫁衣襯著肌膚如雪墩虹。 梳的紋絲不亂的頭發(fā)上嘱巾,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天,我揣著相機(jī)與錄音诫钓,去河邊找鬼旬昭。 笑死,一個胖子當(dāng)著我的面吹牛菌湃,可吹牛的內(nèi)容都是我干的问拘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼惧所,長吁一口氣:“原來是場噩夢啊……” “哼骤坐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起下愈,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤纽绍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后势似,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顶岸,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年叫编,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霹抛。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡搓逾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杯拐,到底是詐尸還是另有隱情霞篡,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布端逼,位于F島的核電站朗兵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏顶滩。R本人自食惡果不足惜余掖,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望礁鲁。 院中可真熱鬧盐欺,春花似錦、人聲如沸仅醇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽析二。三九已至粉洼,卻和暖如春节预,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背属韧。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工安拟, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挫剑。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓去扣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親樊破。 傳聞我的和親對象是個殘疾皇子愉棱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,499評論 2 348

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