spark小应用二:分组分数排序(SCALA)

需求:
1)按照第一个字段进行分组
2)对分组中的第二个字段进行排序(降序)
3)获取每个分组Top Key(比如获取前三个值)
数据:

aa 78
bb 98
aa 80
cc 98
aa 69
cc 87
bb 97
cc 86
aa 97
bb 78
bb 34
cc 85
bb 92
cc 72
bb 33
bb 23

1、按照第一个字段进行分组

val rdd = sc.textFile("hdfs://mycluster/user/bpf/sparkApp/wordcount/input/score.txt")
rdd.map(_.split(" ")).map(x => (x(0),x(1))).groupByKey

.map(_.split(” “))后生成:

Array[Array[String]] = Array(
        Array(aa, 78), Array(bb, 98), Array(aa, 80), Array(cc, 98), 
        Array(aa, 69), Array(cc, 87), Array(bb, 97), Array(cc, 86), 
        Array(aa, 97), Array(bb, 78), Array(bb, 34), Array(cc, 85), 
        Array(bb, 92), Array(cc, 72), Array(bb, 33), Array(bb, 23)
)

.map(x => (x(0),x(1)))后生成

Array[(String, String)] = Array(
        (aa,78), (bb,98), (aa,80), (cc,98), 
        (aa,69), (cc,87), (bb,97), (cc,86), 
        (aa,97), (bb,78), (bb,34), (cc,85), 
        (bb,92), (cc,72), (bb,33), (bb,23)
)

.groupByKey后生成

Array[(String, Iterable[String])] = Array(
        (aa,CompactBuffer(78, 80, 69, 97)), 
        (bb,CompactBuffer(98, 97, 78, 34, 92, 33, 23)), 
        (cc,CompactBuffer(98, 87, 86, 85, 72))
)

此时满足了第一个需求,按照第一个字段进行分组

2、对分组中的第二个字段进行排序(降序)

发现CompactBuffer是一个迭代器。于是将迭代器转化为List,先升序,再逆序

Iterable方法: toList转为Llist

List方法:     sorted升序排序 reverse逆序 
rdd.map(_.split(" ")).map(x => (x(0),x(1))).groupByKey.map(
    x => {
    val xx = x._1
    val yy = x._2
    (xx,yy.toList.sorted.reverse)
    }
)
展示每步得到的结果:

yy.toList:
Array[List[String]] = Array(
        List(78, 80, 69, 97), 
        List(98, 97, 78, 34, 92, 33, 23), 
        List(98, 87, 86, 85, 72)
)

yy.toList.sorted:
Array[List[String]] = Array(
        List(69, 78, 80, 97), 
        List(23, 33, 34, 78, 92, 97, 98), 
        List(72, 85, 86, 87, 98)
)
yy.toList.sorted.reverse:
Array[List[String]] = Array(
        List(97, 80, 78, 69), 
        List(98, 97, 92, 78, 34, 33, 23), 
        List(98, 87, 86, 85, 72)
)

3、获取每个分组Top Key(比如获取前三个值)

还是使用take(N方法)

rdd.map(_.split(" ")).map(x => (x(0),x(1))).groupByKey.map(
    x => {
    val xx = x._1
    val yy = x._2
    (xx,yy.toList.sorted.reverse.take(3))//使用take(3)
    }
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值