Apache Spark:在收集小集合之前或之后对结果进行排序?

时间:2017-04-28 15:05:57

标签: apache-spark

标题几乎说明了一切。

例如,在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
  }

预期产量非常小。

我想知道是否在收集之前/之后进行排序的原因?一般来说,是否有规则帮助我们选择最好的一个?

1 个答案:

答案 0 :(得分:1)

这取决于你想要达到的目标。 我认为,在代码中对收集的输出进行排序很少有意义,但它也不应该产生差异

如果你的数据足够大,它会产生影响 - 那么你就不应该首先收集数据。 如果你的数据足够小,那么你可能希望能够动态/交互式地进行排序 - 而且以一种强硬的方式排序是没有意义的 - 而是你想在前端排序。

除非出于某种原因,您要向驱动程序收集数十万条条目,否则无法以分布式方式进行排序。

实际上,我的建议是:使用您认为更容易维护的API。在示例的情况下,使用反向使代码稍微受阻,因此我可能更喜欢第二个。

支持以分布式方式进行排序的一个原因是,如果通过在查询的其余部分中进行排序可以获得某些东西 - 通过在本地排序你在Spark查询优化器周围编写 - 可能会两次工作。 / p>