需求:
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)
}
)