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)
    }
)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章