1,避免在算子内部使用scala的方法将集合toList,如果只是取TopN的话可以定义排序规则,使用spark的top()算子
错误示范:
解决方法:定义排序规则,使用rdd的top()
val bigdataRDD: RDD[((String, String), Int)] = rdd1.filter(_._1._1.equals(sub))
implicit val orderRules: Ordering[((String, String), Int)] = Ordering[Int].on[((String, String), Int)](t => t._2)
val res = bigdataRDD.top(2) //Action
2,避免用scala的toList,自定义排序规则后,使用treeSet来排序
val result: RDD[((String, String), Int)] = rdd2.mapPartitions(it => {
//定义一个可以排序的特殊集合 TreeSet
implicit val rules = Ordering[Int].on[((String, String), Int)](t => -t._2)
val sorter = new mutable.TreeSet[((String, String), Int)]()
//遍历迭代器
it.foreach(t => {
//将数据添加到treesetzhong
sorter += t
if (sorter.size > 2) {
sorter -= sorter.last //treeSet中一共放入N+1个元素,每次插入元素后删除最后一个元素(最小值)
}
})
sorter.iterator
})
3,分区排序使用repatitionAndSortWithPartitions