标题几乎说明了一切。
例如,在this course中,他们定义了这两种方法:
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
}
预期产量非常小。
我想知道是否在收集之前/之后进行排序的原因?一般来说,是否有规则帮助我们选择最好的一个?
答案 0 :(得分:1)
这取决于你想要达到的目标。 我认为,在代码中对收集的输出进行排序很少有意义,但它也不应该产生差异。
如果你的数据足够大,它会产生影响 - 那么你就不应该首先收集数据。 如果你的数据足够小,那么你可能希望能够动态/交互式地进行排序 - 而且以一种强硬的方式排序是没有意义的 - 而是你想在前端排序。
除非出于某种原因,您要向驱动程序收集数十万条条目,否则无法以分布式方式进行排序。
实际上,我的建议是:使用您认为更容易维护的API。在示例的情况下,使用反向使代码稍微受阻,因此我可能更喜欢第二个。
支持以分布式方式进行排序的一个原因是,如果通过在查询的其余部分中进行排序可以获得某些东西 - 通过在本地排序你在Spark查询优化器周围编写 - 可能会两次工作。 / p>