flatMap 与 map 的效率,然后是 Spark 中的 reduce
Efficiency of flatMap vs map followed by reduce in Spark
我有一个包含多行文本的文本文件 sherlock.txt。我使用 spark-shell 加载它:
val textFile = sc.textFile("sherlock.txt")
我的目的是统计文件中的字数。我遇到了两种替代方法来完成这项工作。
首先使用平面地图:
textFile.flatMap(line => line.split(" ")).count()
第二次使用 map,然后使用 reduce:
textFile.map(line => line.split(" ").size).reduce((a, b) => a + b)
两者都正确地产生相同的结果。我想知道上述两种替代实现在时间和 space 复杂度上的差异,如果确实存在的话?
scala 解释器是否将两者都转换为最有效的形式?
我认为最惯用的处理方式是 map
和 sum
:
textFile.map(_.split(" ").size).sum
但最终总成本将由 line.split(" ")
决定。
通过手动遍历字符串并计算连续的空格而不是构建新的 Array
,您可能会做得更好一些,但我怀疑它是否值得大惊小怪。
如果你喜欢更深入一点的洞察力count
is defined as:
def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum
其中 Utils.getIteratorSize
几乎是对 Iterator
的简单迭代,其中总和为 sum
is equivalent to
_.fold(0.0)(_ + _)
我有一个包含多行文本的文本文件 sherlock.txt。我使用 spark-shell 加载它:
val textFile = sc.textFile("sherlock.txt")
我的目的是统计文件中的字数。我遇到了两种替代方法来完成这项工作。
首先使用平面地图:
textFile.flatMap(line => line.split(" ")).count()
第二次使用 map,然后使用 reduce:
textFile.map(line => line.split(" ").size).reduce((a, b) => a + b)
两者都正确地产生相同的结果。我想知道上述两种替代实现在时间和 space 复杂度上的差异,如果确实存在的话?
scala 解释器是否将两者都转换为最有效的形式?
我认为最惯用的处理方式是 map
和 sum
:
textFile.map(_.split(" ").size).sum
但最终总成本将由 line.split(" ")
决定。
通过手动遍历字符串并计算连续的空格而不是构建新的 Array
,您可能会做得更好一些,但我怀疑它是否值得大惊小怪。
如果你喜欢更深入一点的洞察力count
is defined as:
def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum
其中 Utils.getIteratorSize
几乎是对 Iterator
的简单迭代,其中总和为 sum
is equivalent to
_.fold(0.0)(_ + _)