5

我有一个包含多行文本的文本文件 sherlock.txt。我使用以下方法将其加载到 spark-shell 中:

val textFile = sc.textFile("sherlock.txt")

我的目的是计算文件中的字数。我遇到了两种替代方法来完成这项工作。

首先使用flatMap:

textFile.flatMap(line => line.split(" ")).count()

第二次使用map,然后使用reduce:

textFile.map(line => line.split(" ").size).reduce((a, b) => a + b)

两者都正确产生相同的结果。我想知道上述两种替代实现在时间和空间复杂度上的差异,如果确实有的话?

scala 解释器是否将两者都转换为最有效的形式?

4

1 回答 1

6

我会争辩说,处理这个问题的最惯用的方法是mapsum

textFile.map(_.split(" ").size).sum

但最终总成本将占主导地位line.split(" ")

您可以通过手动迭代字符串并计算连续的空格而不是构建新的空格来做得更好,Array但我怀疑这是否值得大惊小怪。

如果您更喜欢更深入的见解count,则定义为

def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum  

whereUtils.getIteratorSize几乎是一个简单的迭代Iterator和一个的总和,sum相当于

_.fold(0.0)(_ + _)
于 2016-03-30T10:33:46.147 回答