加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 在groupBy之后取上前N并将它们视为RDD

发布时间:2020-12-16 18:45:54 所属栏目:安全 来源:网络整理
导读:我想在RDD的groupByKey之后得到前N个项目,并将topNPerGroup的类型(在下面)转换为RDD [(String,Int)],其中List [Int]值被展平 数据是 val data = sc.parallelize(Seq("foo"-3,"foo"-1,"foo"-2,"bar"-6,"bar"-5,"bar"-4)) 每组前N项计算如下: val topNPerGrou
我想在RDD的groupByKey之后得到前N个项目,并将topNPerGroup的类型(在下面)转换为RDD [(String,Int)],其中List [Int]值被展平

数据是

val data = sc.parallelize(Seq("foo"->3,"foo"->1,"foo"->2,"bar"->6,"bar"->5,"bar"->4))

每组前N项计算如下:

val topNPerGroup: RDD[(String,List[Int]) = data.groupByKey.map { 
   case (key,numbers) => 
       key -> numbers.toList.sortBy(-_).take(2)
}

结果是

(bar,List(6,5))
(foo,List(3,2))

由…打印

topNPerGroup.collect.foreach(println)

如果我实现,topNPerGroup.collect.foreach(println)将生成(预期结果!)

(bar,6)
(bar,5)
(foo,3)
(foo,2)

解决方法

你的问题有点令人困惑,但我认为这可以满足您的需求:

val flattenedTopNPerGroup = 
    topNPerGroup.flatMap({case (key,numbers) => numbers.map(key -> _)})

并在repl中打印出你想要的东西:

flattenedTopNPerGroup.collect.foreach(println)
(foo,2)
(bar,5)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读