【问题标题】:How to sort RDD如何对RDD进行排序
【发布时间】:2016-02-19 21:07:21
【问题描述】:

我有 scoreTriplets 是 RDD[ARRAY[String]] 我按以下方式排序。

var ScoreTripletsArray = scoreTriplets.collect()
  if (ScoreTripletsArray.size > 0) {        
    /*Sort the ScoreTripletsArray descending by score field*/        
    scala.util.Sorting.stableSort(ScoreTripletsArray, (e1: Array[String], e2: Array[String]) => e1(3).toInt > e2(3).toInt)
}

但是如果缺少元素,collect() 会很重。

所以我需要在不使用 collect() 的情况下按 score 对 RDD 进行排序。
scoreTriples 为 RDD[ARRAY[String]] RDD 的每一行都会存储以下变量的数组。
EdgeId sourceID destID score sourceNAme destNAme 距离

请给我任何参考或提示。

【问题讨论】:

    标签: scala sorting apache-spark rdd


    【解决方案1】:

    由于洗牌,即使没有收集,排序也是一项昂贵的操作,但您可以使用sortBy 方法:

    import scala.util.Random
    
    val data = Seq.fill(10)(Array.fill(3)("") :+ Random.nextInt.toString)
    val rdd  = sc.parallelize(data)
    
    val sorted = rdd.sortBy(_.apply(3).toInt)
    sorted.take(3)
    // Array[Array[String]] = Array(
    //   Array("", "", "", -1660860558),
    //   Array("", "", "", -1643214719),
    //   Array("", "", "", -1206834289))
    

    如果您只对排名靠前的结果感兴趣,那么通常首选 toptakeOrdered

    import scala.math.Ordering
    
    rdd.takeOrdered(2)(Ordering.by[Array[String], Int](_.apply(3).toInt))
    // Array[Array[String]] = 
    //   Array(Array("", "", "", -1660860558), Array("", "", "", -1643214719))
    
    rdd.top(2)(Ordering.by[Array[String], Int](_.apply(3).toInt))
    // Array[Array[String]] = 
    //   Array(Array("", "", "", 1920955686), Array("", "", "", 1597012602))
    

    【讨论】:

    • 但我有一个问题.. 我需要将 rdd 转换为数组。 。我怎样才能做到这一点?因为我剩下的代码依赖于数组。
    • 如果您想要所有数据,唯一的方法就是收集。 toptakeOrdered 已经返回一个数组。
    • 我可以像rdd.top(rdd.count())(Ordering.by[Array[String], Int](_.apply(3).toInt))那样使用吗?这样我就可以获取所有数据了
    • 这没有意义。 top / takeOrdered 仅在您只需要一小部分数据时才是优越的。否则sortBy 后跟collect 是正确的方法。
    • 是的,它会返回一个数组。
    【解决方案2】:

    RDD 中有 sortBy 方法(见doc)。 你可以做这样的事情

    scoreTriplets.sortBy( _(3).toInt )
    

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 2014-07-13
      • 2021-06-04
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多