当前位置:   article > 正文

spark 实现二次排序_spark val sortresult=result

spark val sortresult=result

在实际业务场景中,二次排序真的非常重要,并且经常遇到,下面来模拟一下以下的场景,实现对电影评分数据进行二次排序,以TimeStamp和Rating两个维度降序排列,值得一提的是,java版本的二次排序非常繁琐,而使用scala实现就简捷,首先我们需要一个继承Ordered和Serializable的类。

数据:

ratings.txt    (UserID::MovieID::Rating::TimeStamp)

  1. 001::01::3::1046454590
  2. 002::02::3::1046454533
  3. 001::03::5::1046454523
  4. 003::02::4::1046454576
  5. 002::07::3::1046454545
  6. 001::06::3::1046454509


  1. class SecondarySortKey(val first:Double,val second:Double) extends Ordered[SecondarySortKey] with Serializable{
  2. //这个类中重写了compare方法
  3. override def compare(that: SecondarySortKey): Int = {
  4. //既然是二次排序,就先判断第一个字段是否相等,如果不相等,就直接排序
  5. if(this.first-that.first!=0){
  6. (this.first-that.first).toInt
  7. }else{
  8. //如果第一个字段相等,就比较第二个字段,若想要实现多次排序,也按照这个模式继续比较下去
  9. if(this.second-that.second>0){
  10. //ceil向上取整
  11. Math.ceil(this.second-that.second).toInt
  12. }else if(this.second-that.second<0){
  13. Math.floor(this.second-that.second).toInt
  14. }else{
  15. (this.second-that.second).toInt
  16. }
  17. }
  18. }
  19. }

然后再加载数据为RDD,再把RDD的每条记录,里面想要的字段封装到上面定义的类中作为key,把该条记录整体作为value

  1. object movies {
  2. def main(args: Array[String]): Unit = {
  3. Logger.getLogger("org").setLevel(Level.WARN)
  4. val sparkConf = new SparkConf().setAppName("movies").setMaster("local[*]")
  5. val sc = new SparkContext(sparkConf)
  6. val ratingsRDD = sc.textFile("C:\\Users\\xxx\\Desktop\\ratings.txt")
  7. val moviesRDD = sc.textFile("C:\\Users\\xxx\\Desktop\\movies.txt")
  8. val usersRDD = sc.textFile("C:\\Users\\xxx\\Desktop\\users.txt")
  9. val pairWithSortKey=ratingsRDD.map(line=>{
  10. val splited=line.split("::")
  11. (new SecondarySortKey(splited(3).toDouble,splited(2).toDouble),line)
  12. })
  13. //直接调用sortBykey,此时会按照之前实现的compare方法排序
  14. val sorted=pairWithSortKey.sortByKey(false)
  15. val sortResult=sorted.map(sortedline=>sortedline._2).take(10)
  16. sortResult.foreach(println(_))
  17. sc.stop()
  18. }
  19. }
结果:
  1. 001::01::3::1046454590
  2. 003::02::4::1046454576
  3. 002::07::3::1046454545
  4. 002::02::3::1046454533
  5. 001::03::5::1046454523
  6. 001::06::3::1046454509

取出排序后的RDD的value,此时这些记录已经是按照时间戳和评分排好序的,从上面结果可以看出已经按照timestamp和评分排序排列了。






声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/993593
推荐阅读
相关标签
  

闽ICP备14008679号