- 方法1:
a. 按照 key 对数据进行聚合(groupByKey)
b. 将 value 转换为数组,利用 scala 的 sortBy 或者 sortWith 进行排序(mapValues)
注意:当数据量太大时,会导致OOM。
val rddData1 = sparkSession.parallelize(Array(("sivela", 15),("sivela", 18),("sivela", 16),("Alice", 15),("Bob", 18)))
val rddGroup = rddData1.groupByKey()
val rddSort = rddGroup.map(line =>{
(line._1, line._2.toList.sortWith(_.toInt > _.toInt).take(1))
})
rddSort.foreach(print)
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("HotCtegoryTop10Analysis")
val sc = new SparkContext(sparkConf)
val rddData1 = sc.parallelize(Array(("sivela", 15),("sivela", 18),("sivela", 16),("Alice", 15),("Bob", 18)))
val rddGroup = rddData1.groupByKey()
val rddSort = rddGroup.mapValues(
line => {
line.toList.sortBy(_.toInt)(Ordering.Int.reverse).take(1)
})
rddSort.foreach(print)
val groupRDD: RDD[(String, Iterable[(String, Int)])] = newMapRDD.groupByKey()
val resultRDD: RDD[(String, List[(String, Int)])] = groupRDD.mapValues(
iter => {
iter.toList.sortBy(_._2)(Ordering.Int.reverse).take(3)
}
)
- 方法2:
a. 取出所有的 key
b. 对 key 进行迭代,每次取出一个 key 利用 spark 的排序算子进行排序 - 方法3:
a. 自定义分区器,按照 key 进行分区,使不同的 key 进到不同的分区
b. 对每个分区运用 spark 的排序算子进行排序