最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spark中使用groupByKey進(jìn)行分組排序的示例代碼

 更新時(shí)間:2023年03月09日 14:55:16   作者:starxhong  
這篇文章主要介紹了spark中使用groupByKey進(jìn)行分組排序的實(shí)例代碼,本文通過實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

任務(wù)需求:已知RDD[(query:String, item_id:String, imp:Int, clk:Int)],要求找到每個(gè)query對(duì)應(yīng)的點(diǎn)擊最多的前2個(gè)item_id,即:按照query分組,并按照clk降序排序,每組取前兩個(gè)。

例如:

(連衣裙,1234,  22,  13)

(牛仔褲,2768,  34,  7)

(連衣裙,1673,45,  9)

(襯衣,3468, 67,  12)

(牛仔褲,2754, 68, 20)

(連衣裙,1976,93,  29)

希望得到:

(連衣裙,1976,93,  29)

(連衣裙,1234,  22,  13)

(牛仔褲,2754, 68, 20)

(牛仔褲,2768,  34,  7)

(襯衣,3468, 67,  12)

先看一個(gè)錯(cuò)誤的版本:

val list = List(("連衣裙",1234, 22, 13),("牛仔褲",2768, 34, 7),("連衣裙",1673,45, 9)
    ,("襯衣",3468,67, 12),("牛仔褲",2754, 68, 20),("連衣裙",1976,93, 29))
val rdd = ss.sparkContext.parallelize(list)
 
val topItem_set= rdd.map(ele => (ele._1, (ele._2, ele._3, ele._4))).groupByKey()
  .map(line => {
        val topItem = line._2.toArray.sortBy(_._3)(Ordering[Int].reverse).take(2)
        topItem.mkString(",")
        topItem.map(x => {(line._1, x._1, x._2, x._3)})
  })
topItem_set.foreach(println)
println()
topItem_set.map(_.mkString).foreach(println)

我們把query作為key,其余放到一起,groupByKey后(map之前),類型為:RDD[(String, Iterable[(String, Int, Int)])],根據(jù)query分組再map,line._2.toArray把Iterable轉(zhuǎn)為Array,sortBy(_._3)是按最后一個(gè)Int即clk排序,(Ordering[Int].reverse)表示從大到?。╯ortBy默認(rèn)從小到大,注意這里的sortBy是Array的成員函數(shù)而不是rdd的sortBy,用法比較不同),take(2)是取前2個(gè),然后返回(query,  item_id)。跑一下上面的過程。

返回:

[Lscala.Tuple4;@2b672e4
[Lscala.Tuple4;@52e50126
[Lscala.Tuple4;@1362b124
 
(連衣裙,1976,93,29)(連衣裙,1234,22,13)
(襯衣,3468,67,12)
(牛仔褲,2754,68,20)(牛仔褲,2768,34,7)

上面3行是直接打印跟預(yù)期稍有差別,同一個(gè)key下的top兩個(gè)元素是作為一個(gè)整體,但已經(jīng)很接近目標(biāo),如果希望拆分,需要使用flatMap:

val topItem_set= rdd.map(ele => (ele._1, (ele._2, ele._3, ele._4))).groupByKey()
  .flatMap(line => {
        val topItem = line._2.toArray.sortBy(_._3)(Ordering[Int].reverse).take(2)
        topItem.mkString(",")
        topItem.map(x => {(line._1, x._1, x._2, x._3)})
  })

為什么呢?GroupByKey后,類型為RDD[(String, Iterable[(String, Int, Int)])],如果用map,那每一個(gè)key對(duì)應(yīng)的一個(gè)Iterable變量,相當(dāng)于一條數(shù)據(jù),map后的結(jié)果自然還是一條。但flatMap,相當(dāng)于map+flat操作,這才是我們真正的需要的形式。

任務(wù)進(jìn)階:要求找到每個(gè)query對(duì)應(yīng)的點(diǎn)擊最多的前2個(gè)item_id,當(dāng)點(diǎn)擊一樣時(shí),選曝光最少的,即:按照query分組,并優(yōu)先按照clk降序排序,其次按照imp升序排序,每組取前兩個(gè)。

例如:

(連衣裙,1234,  22,  13)

(牛仔褲,2768,  34,  7)

(連衣裙,1673,45,  9)

(襯衣,3468, 67,  12)

(牛仔褲,2754, 68, 20)

(連衣裙,1976,93,  29)

(牛仔褲,1232,  20, 7)

希望得到:

(連衣裙,1976,93,  29)

(連衣裙,1234,  22,  13)

(牛仔褲,2754, 68, 20)

(牛仔褲,1232,  20,  7)

(襯衣,2768,  34,  7)

注意,上面樣本中牛仔褲有兩個(gè)樣本的點(diǎn)擊都是7,但標(biāo)紅的樣本曝光數(shù)是更小,所以應(yīng)該入選top2,直接上代碼吧:

val list2 = List(("連衣裙",1234, 22, 13),("牛仔褲",2768, 34, 7),("連衣裙",1673,45, 9)
    ,("襯衣",3468,67, 12),("牛仔褲",2754, 68, 20),("連衣裙",1976,93, 29),("牛仔褲",1232, 20, 7))
    val rdd2 = ss.sparkContext.parallelize(list2)
    rdd2.foreach(println)
    val topItem_set= rdd2.map(ele => (ele._1, (ele._2, ele._3, ele._4))).groupByKey()
      .flatMap(line => {
        val topItem = line._2.toArray.sortBy(x => (x._3, x._2))(Ordering.Tuple2(Ordering[Int].reverse, Ordering[Int])).take(2)
        topItem.map(x => {(line._1, x._1, x._2, x._3)})
      })
    topItem_set.foreach(println)

sortBy可以根據(jù)需要增加排序維度,參數(shù)按優(yōu)先級(jí)排列,這個(gè)在日常使用較多。

到此這篇關(guān)于spark中使用groupByKey進(jìn)行分組排序的文章就介紹到這了,更多相關(guān)spark使用groupByKey分組排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot靜態(tài)資源路徑配置及主頁顯示

    SpringBoot靜態(tài)資源路徑配置及主頁顯示

    這篇文章主要介紹了SpringBoot靜態(tài)資源路徑配置及主頁顯示,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • .NET程序員如何入門Spring Boot詳解

    .NET程序員如何入門Spring Boot詳解

    這篇文章主要介紹了.NET程序員如何快入門Spring Boot,微軟給VS Code提供了編寫Java的插件,你可以在VS Code上愉快地寫Java。,需要的朋友可以參考下
    2019-06-06
  • Spring init-method與destroy-method屬性的用法解析

    Spring init-method與destroy-method屬性的用法解析

    這篇文章主要介紹了Spring init-method與destroy-method屬性的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解Springboot @Cacheable 注解(指定緩存位置)

    詳解Springboot @Cacheable 注解(指定緩存位置)

    這篇文章主要介紹了詳解Springboot @Cacheable 注解(指定緩存位置),使用? @Cacheable ?注解就可以將運(yùn)行結(jié)果緩存,以后查詢相同的數(shù)據(jù),直接從緩存中取,不需要調(diào)用方法,需要的朋友可以參考下
    2023-09-09
  • Spring Security動(dòng)態(tài)權(quán)限的實(shí)現(xiàn)方法詳解

    Spring Security動(dòng)態(tài)權(quán)限的實(shí)現(xiàn)方法詳解

    這篇文章主要和小伙伴們簡(jiǎn)單介紹下 Spring Security 中的動(dòng)態(tài)權(quán)限方案,以便于小伙伴們更好的理解 TienChin 項(xiàng)目中的權(quán)限方案,感興趣的可以了解一下
    2022-06-06
  • SpringBoot?實(shí)現(xiàn)CAS?Server統(tǒng)一登錄認(rèn)證的詳細(xì)步驟

    SpringBoot?實(shí)現(xiàn)CAS?Server統(tǒng)一登錄認(rèn)證的詳細(xì)步驟

    ??CAS(Central?Authentication?Service)中心授權(quán)服務(wù),是一個(gè)開源項(xiàng)目,目的在于為Web應(yīng)用系統(tǒng)提供一種可靠的單點(diǎn)登錄,這篇文章主要介紹了SpringBoot?實(shí)現(xiàn)CAS?Server統(tǒng)一登錄認(rèn)證,需要的朋友可以參考下
    2024-02-02
  • Java冒泡排序簡(jiǎn)單實(shí)現(xiàn)

    Java冒泡排序簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了Java冒泡排序簡(jiǎn)單實(shí)現(xiàn),具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java實(shí)例講解多態(tài)數(shù)組的使用

    Java實(shí)例講解多態(tài)數(shù)組的使用

    本文章向大家介紹Java多態(tài)數(shù)組,主要包括Java多態(tài)數(shù)組使用實(shí)例、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-05-05
  • java 數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列

    java 數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列

    這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的相關(guān)資料,這里對(duì)java中的棧和隊(duì)列都做出實(shí)現(xiàn)實(shí)例來幫助大家理解學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下
    2017-07-07
  • Maven編譯文件的編碼設(shè)置方法

    Maven編譯文件的編碼設(shè)置方法

    在使用Maven進(jìn)行Java項(xiàng)目的構(gòu)建時(shí),正確的文件編碼設(shè)置對(duì)于確保項(xiàng)目能夠正確編譯和運(yùn)行至關(guān)重要,本文將詳細(xì)介紹如何在Maven中設(shè)置編譯文件的編碼,以確保項(xiàng)目能夠正確處理各種語言的文本內(nèi)容,需要的朋友可以參考下
    2025-02-02

最新評(píng)論

崇阳县| 清原| 揭西县| 衡阳县| 北票市| 华蓥市| 二连浩特市| 海原县| 开江县| 容城县| 青州市| 沭阳县| 麻城市| 浦东新区| 怀来县| 宜春市| 吉水县| 普定县| 准格尔旗| 双牌县| 廉江市| 上林县| 兴仁县| 勐海县| 铜梁县| 元阳县| 宜州市| 东安县| 寿光市| 遵义县| 九龙县| 龙山县| 靖江市| 绥芬河市| 文登市| 临洮县| 大英县| 凤翔县| 栖霞市| 新建县| 江陵县|