Apache spark apachespark:对小集合在collect之前还是之后对结果进行排序?

Apache spark apachespark:对小集合在collect之前还是之后对结果进行排序?,apache-spark,Apache Spark,标题几乎说明了一切 例如,在中,他们定义了这两种方法: def rankLangsUsingIndex(index: RDD[(String, Iterable[WikipediaArticle])]): List[(String, Int)] = { index.map(...) .sortBy(pair => pair._2) // <- sortBy BEFORE collect .collect() .toList .reverse }

标题几乎说明了一切

例如,在中,他们定义了这两种方法:

def rankLangsUsingIndex(index: RDD[(String, Iterable[WikipediaArticle])]): List[(String, Int)] = {
  index.map(...)
    .sortBy(pair => pair._2) // <- sortBy BEFORE collect
    .collect()
    .toList
    .reverse
}

def rankLangsReduceByKey(langs: List[String], rdd: RDD[WikipediaArticle]): List[(String, Int)] = {
    rdd.flatMap(...)
      .reduceByKey(_ + _)
      .collect()
      .toList
      .sortWith(_._2 > _._2) // <- sort AFTER collect
  }
def rankLangsUsingIndex(索引:RDD[(字符串,Iterable[WikipediaArticle])):列表[(字符串,Int)]={
index.map(…)

.sortBy(pair=>pair.\u 2)//.\u 2)/这取决于您想要实现的目标。 我认为,在代码中对收集的输出进行排序几乎没有意义,但也不应该有什么区别

如果你的数据足够大,这将产生影响——那么你不应该一开始就收集数据。 如果您的数据足够小,那么您可能希望能够以动态/交互方式进行排序,而以硬排序的方式进行排序没有什么意义,而是希望在前端内部进行排序

除非出于某种原因,您正在收集数十万条驱动程序条目,否则没有必要以分布式方式进行排序

实际上,我的建议是:使用任何你认为更容易维护的API。在这个例子中,反向使用会使代码稍微受阻,所以我可能更喜欢第二个。

支持以分布式方式进行排序的一个原因是,如果在查询的其余部分进行排序(通过围绕Spark query optimizer编写的本地排序)可以获得一些好处,那么可能需要做两次工作